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

Unified Diff: cc/output/overlay_candidate.cc

Issue 1373373003: Mac Overlays: Add AllOrNothing strategy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@OverlayTest
Patch Set: Rebase off master Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/output/overlay_candidate.h ('k') | cc/output/overlay_strategy_all_or_nothing.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « cc/output/overlay_candidate.h ('k') | cc/output/overlay_strategy_all_or_nothing.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698