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

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: 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
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) {

Powered by Google App Engine
This is Rietveld 408576698