| Index: cc/output/overlay_candidate.cc
|
| diff --git a/cc/output/overlay_candidate.cc b/cc/output/overlay_candidate.cc
|
| index c05947b3d17956e0980b082d8654ca5582647424..5ecdc32ed3602e8095e7876e57778ea59db0d154 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"
|
|
|
| @@ -32,24 +36,8 @@ Axis VectorToAxis(const gfx::Vector3dF& vec) {
|
| return NONE;
|
| }
|
|
|
| -} // namespace
|
| -
|
| -OverlayCandidate::OverlayCandidate()
|
| - : transform(gfx::OVERLAY_TRANSFORM_NONE),
|
| - format(RGBA_8888),
|
| - uv_rect(0.f, 0.f, 1.f, 1.f),
|
| - is_clipped(false),
|
| - use_output_surface_for_resource(false),
|
| - resource_id(0),
|
| - plane_z_order(0),
|
| - overlay_handled(false) {}
|
| -
|
| -OverlayCandidate::~OverlayCandidate() {}
|
| -
|
| -// static
|
| -gfx::OverlayTransform OverlayCandidate::GetOverlayTransform(
|
| - const gfx::Transform& quad_transform,
|
| - bool y_flipped) {
|
| +gfx::OverlayTransform GetOverlayTransform(const gfx::Transform& quad_transform,
|
| + bool y_flipped) {
|
| if (!quad_transform.Preserves2dAxisAlignment()) {
|
| return gfx::OVERLAY_TRANSFORM_INVALID;
|
| }
|
| @@ -79,10 +67,10 @@ gfx::OverlayTransform OverlayCandidate::GetOverlayTransform(
|
| return gfx::OVERLAY_TRANSFORM_INVALID;
|
| }
|
|
|
| -// static
|
| -gfx::OverlayTransform OverlayCandidate::ModifyTransform(
|
| - gfx::OverlayTransform in,
|
| - gfx::OverlayTransform delta) {
|
| +// Apply transform |delta| to |in| and return the resulting transform,
|
| +// or OVERLAY_TRANSFORM_INVALID.
|
| +gfx::OverlayTransform ComposeTransforms(gfx::OverlayTransform delta,
|
| + gfx::OverlayTransform in) {
|
| // There are 8 different possible transforms. We can characterize these
|
| // by looking at where the origin moves and the direction the horizontal goes.
|
| // (TL=top-left, BR=bottom-right, H=horizontal, V=vertical).
|
| @@ -175,15 +163,130 @@ gfx::OverlayTransform OverlayCandidate::ModifyTransform(
|
| }
|
| }
|
|
|
| +} // namespace
|
| +
|
| +OverlayCandidate::OverlayCandidate()
|
| + : transform(gfx::OVERLAY_TRANSFORM_NONE),
|
| + format(RGBA_8888),
|
| + uv_rect(0.f, 0.f, 1.f, 1.f),
|
| + is_clipped(false),
|
| + use_output_surface_for_resource(false),
|
| + resource_id(0),
|
| + plane_z_order(0),
|
| + overlay_handled(false) {}
|
| +
|
| +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;
|
| +
|
| + auto& transform = quad->shared_quad_state->quad_to_target_transform;
|
| + candidate->display_rect = gfx::RectF(quad->rect);
|
| + transform.TransformRect(&candidate->display_rect);
|
| + candidate->quad_rect_in_target_space =
|
| + MathUtil::MapEnclosingClippedRect(transform, quad->rect);
|
| +
|
| + candidate->format = RGBA_8888;
|
| + 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 = ComposeTransforms(
|
| + gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL, candidate->transform);
|
| + 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 = ComposeTransforms(
|
| + gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, candidate->transform);
|
| + candidate->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y());
|
| + }
|
| + return true;
|
| +}
|
| +
|
| // static
|
| -gfx::RectF OverlayCandidate::GetOverlayRect(
|
| - const gfx::Transform& quad_transform,
|
| - const gfx::Rect& rect) {
|
| - DCHECK(quad_transform.Preserves2dAxisAlignment());
|
| -
|
| - gfx::RectF float_rect(rect);
|
| - quad_transform.TransformRect(&float_rect);
|
| - return float_rect;
|
| +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;
|
| }
|
|
|
| } // namespace cc
|
|
|