| 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" |
| 16 #include "cc/resources/resource_provider.h" |
| 15 #include "ui/gfx/geometry/rect_conversions.h" | 17 #include "ui/gfx/geometry/rect_conversions.h" |
| 16 #include "ui/gfx/geometry/vector3d_f.h" | 18 #include "ui/gfx/geometry/vector3d_f.h" |
| 17 | 19 |
| 18 namespace cc { | 20 namespace cc { |
| 19 | 21 |
| 20 namespace { | 22 namespace { |
| 21 // Tolerance for considering axis vector elements to be zero. | 23 // Tolerance for considering axis vector elements to be zero. |
| 22 const SkMScalar kEpsilon = std::numeric_limits<float>::epsilon(); | 24 const SkMScalar kEpsilon = std::numeric_limits<float>::epsilon(); |
| 23 | 25 |
| 24 enum Axis { NONE, AXIS_POS_X, AXIS_NEG_X, AXIS_POS_Y, AXIS_NEG_Y }; | 26 enum Axis { NONE, AXIS_POS_X, AXIS_NEG_X, AXIS_POS_Y, AXIS_NEG_Y }; |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 uv_rect(0.f, 0.f, 1.f, 1.f), | 173 uv_rect(0.f, 0.f, 1.f, 1.f), |
| 172 is_clipped(false), | 174 is_clipped(false), |
| 173 use_output_surface_for_resource(false), | 175 use_output_surface_for_resource(false), |
| 174 resource_id(0), | 176 resource_id(0), |
| 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 |
| 181 bool OverlayCandidate::FromDrawQuad(const DrawQuad* quad, | 183 bool OverlayCandidate::FromDrawQuad(ResourceProvider* resource_provider, |
| 184 const DrawQuad* quad, |
| 182 OverlayCandidate* candidate) { | 185 OverlayCandidate* candidate) { |
| 183 if (quad->needs_blending || quad->shared_quad_state->opacity != 1.f || | 186 if (quad->needs_blending || quad->shared_quad_state->opacity != 1.f || |
| 184 quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) | 187 quad->shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) |
| 185 return false; | 188 return false; |
| 186 | 189 |
| 187 auto& transform = quad->shared_quad_state->quad_to_target_transform; | 190 auto& transform = quad->shared_quad_state->quad_to_target_transform; |
| 188 candidate->display_rect = gfx::RectF(quad->rect); | 191 candidate->display_rect = gfx::RectF(quad->rect); |
| 189 transform.TransformRect(&candidate->display_rect); | 192 transform.TransformRect(&candidate->display_rect); |
| 190 candidate->quad_rect_in_target_space = | 193 candidate->quad_rect_in_target_space = |
| 191 MathUtil::MapEnclosingClippedRect(transform, quad->rect); | 194 MathUtil::MapEnclosingClippedRect(transform, quad->rect); |
| 192 | 195 |
| 193 candidate->format = RGBA_8888; | 196 candidate->format = RGBA_8888; |
| 194 candidate->clip_rect = quad->shared_quad_state->clip_rect; | 197 candidate->clip_rect = quad->shared_quad_state->clip_rect; |
| 195 candidate->is_clipped = quad->shared_quad_state->is_clipped; | 198 candidate->is_clipped = quad->shared_quad_state->is_clipped; |
| 196 | 199 |
| 197 switch (quad->material) { | 200 switch (quad->material) { |
| 198 case DrawQuad::TEXTURE_CONTENT: | 201 case DrawQuad::TEXTURE_CONTENT: |
| 199 return FromTextureQuad(TextureDrawQuad::MaterialCast(quad), candidate); | 202 return FromTextureQuad(resource_provider, |
| 203 TextureDrawQuad::MaterialCast(quad), candidate); |
| 200 case DrawQuad::STREAM_VIDEO_CONTENT: | 204 case DrawQuad::STREAM_VIDEO_CONTENT: |
| 201 return FromStreamVideoQuad(StreamVideoDrawQuad::MaterialCast(quad), | 205 return FromStreamVideoQuad(resource_provider, |
| 206 StreamVideoDrawQuad::MaterialCast(quad), |
| 202 candidate); | 207 candidate); |
| 203 case DrawQuad::IO_SURFACE_CONTENT: | 208 case DrawQuad::IO_SURFACE_CONTENT: |
| 204 return FromIOSurfaceQuad(IOSurfaceDrawQuad::MaterialCast(quad), | 209 return FromIOSurfaceQuad( |
| 205 candidate); | 210 resource_provider, IOSurfaceDrawQuad::MaterialCast(quad), candidate); |
| 206 default: | 211 default: |
| 207 break; | 212 break; |
| 208 } | 213 } |
| 209 | 214 |
| 210 return false; | 215 return false; |
| 211 } | 216 } |
| 212 | 217 |
| 213 // static | 218 // static |
| 214 bool OverlayCandidate::IsInvisibleQuad(const DrawQuad* quad) { | 219 bool OverlayCandidate::IsInvisibleQuad(const DrawQuad* quad) { |
| 215 if (quad->material == DrawQuad::SOLID_COLOR) { | 220 if (quad->material == DrawQuad::SOLID_COLOR) { |
| 216 SkColor color = SolidColorDrawQuad::MaterialCast(quad)->color; | 221 SkColor color = SolidColorDrawQuad::MaterialCast(quad)->color; |
| 217 float opacity = quad->shared_quad_state->opacity; | 222 float opacity = quad->shared_quad_state->opacity; |
| 218 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; | 223 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; |
| 219 return quad->ShouldDrawWithBlending() && | 224 return quad->ShouldDrawWithBlending() && |
| 220 alpha < std::numeric_limits<float>::epsilon(); | 225 alpha < std::numeric_limits<float>::epsilon(); |
| 221 } | 226 } |
| 222 return false; | 227 return false; |
| 223 } | 228 } |
| 224 | 229 |
| 225 // static | 230 // static |
| 226 bool OverlayCandidate::FromTextureQuad(const TextureDrawQuad* quad, | 231 bool OverlayCandidate::FromTextureQuad(ResourceProvider* resource_provider, |
| 232 const TextureDrawQuad* quad, |
| 227 OverlayCandidate* candidate) { | 233 OverlayCandidate* candidate) { |
| 228 if (!quad->allow_overlay()) | 234 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 229 return false; | 235 return false; |
| 230 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 236 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 231 quad->shared_quad_state->quad_to_target_transform, quad->y_flipped); | 237 quad->shared_quad_state->quad_to_target_transform, quad->y_flipped); |
| 232 if (quad->background_color != SK_ColorTRANSPARENT || | 238 if (quad->background_color != SK_ColorTRANSPARENT || |
| 233 quad->premultiplied_alpha || | 239 quad->premultiplied_alpha || |
| 234 overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | 240 overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| 235 return false; | 241 return false; |
| 236 candidate->resource_id = quad->resource_id(); | 242 candidate->resource_id = quad->resource_id(); |
| 237 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); | 243 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); |
| 238 candidate->transform = overlay_transform; | 244 candidate->transform = overlay_transform; |
| 239 candidate->uv_rect = BoundingRect(quad->uv_top_left, quad->uv_bottom_right); | 245 candidate->uv_rect = BoundingRect(quad->uv_top_left, quad->uv_bottom_right); |
| 240 return true; | 246 return true; |
| 241 } | 247 } |
| 242 | 248 |
| 243 // static | 249 // static |
| 244 bool OverlayCandidate::FromStreamVideoQuad(const StreamVideoDrawQuad* quad, | 250 bool OverlayCandidate::FromStreamVideoQuad(ResourceProvider* resource_provider, |
| 251 const StreamVideoDrawQuad* quad, |
| 245 OverlayCandidate* candidate) { | 252 OverlayCandidate* candidate) { |
| 246 if (!quad->allow_overlay()) | 253 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 247 return false; | 254 return false; |
| 248 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 255 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 249 quad->shared_quad_state->quad_to_target_transform, false); | 256 quad->shared_quad_state->quad_to_target_transform, false); |
| 250 if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | 257 if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| 251 return false; | 258 return false; |
| 252 if (!quad->matrix.IsScaleOrTranslation()) { | 259 if (!quad->matrix.IsScaleOrTranslation()) { |
| 253 // We cannot handle anything other than scaling & translation for texture | 260 // We cannot handle anything other than scaling & translation for texture |
| 254 // coordinates yet. | 261 // coordinates yet. |
| 255 return false; | 262 return false; |
| 256 } | 263 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 279 candidate->uv_rect = gfx::RectF(uv0.x(), uv1.y(), delta.x(), -delta.y()); | 286 candidate->uv_rect = gfx::RectF(uv0.x(), uv1.y(), delta.x(), -delta.y()); |
| 280 } else { | 287 } else { |
| 281 candidate->transform = ComposeTransforms( | 288 candidate->transform = ComposeTransforms( |
| 282 gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, candidate->transform); | 289 gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL, candidate->transform); |
| 283 candidate->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y()); | 290 candidate->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y()); |
| 284 } | 291 } |
| 285 return true; | 292 return true; |
| 286 } | 293 } |
| 287 | 294 |
| 288 // static | 295 // static |
| 289 bool OverlayCandidate::FromIOSurfaceQuad(const IOSurfaceDrawQuad* quad, | 296 bool OverlayCandidate::FromIOSurfaceQuad(ResourceProvider* resource_provider, |
| 297 const IOSurfaceDrawQuad* quad, |
| 290 OverlayCandidate* candidate) { | 298 OverlayCandidate* candidate) { |
| 291 if (!quad->allow_overlay) | 299 if (!resource_provider->IsOverlayCandidate(quad->io_surface_resource_id())) |
| 292 return false; | 300 return false; |
| 293 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 301 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 294 quad->shared_quad_state->quad_to_target_transform, false); | 302 quad->shared_quad_state->quad_to_target_transform, false); |
| 295 if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) | 303 if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) |
| 296 return false; | 304 return false; |
| 297 candidate->resource_id = quad->io_surface_resource_id(); | 305 candidate->resource_id = quad->io_surface_resource_id(); |
| 298 candidate->resource_size_in_pixels = quad->io_surface_size; | 306 candidate->resource_size_in_pixels = quad->io_surface_size; |
| 299 candidate->transform = overlay_transform; | 307 candidate->transform = overlay_transform; |
| 300 candidate->uv_rect = gfx::RectF(1.f, 1.f); | 308 candidate->uv_rect = gfx::RectF(1.f, 1.f); |
| 301 return true; | 309 return true; |
| 302 } | 310 } |
| 303 | 311 |
| 304 } // namespace cc | 312 } // namespace cc |
| OLD | NEW |