| 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" |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 | 167 |
| 168 } // namespace | 168 } // namespace |
| 169 | 169 |
| 170 OverlayCandidate::OverlayCandidate() | 170 OverlayCandidate::OverlayCandidate() |
| 171 : transform(gfx::OVERLAY_TRANSFORM_NONE), | 171 : transform(gfx::OVERLAY_TRANSFORM_NONE), |
| 172 format(RGBA_8888), | 172 format(RGBA_8888), |
| 173 uv_rect(0.f, 0.f, 1.f, 1.f), | 173 uv_rect(0.f, 0.f, 1.f, 1.f), |
| 174 is_clipped(false), | 174 is_clipped(false), |
| 175 use_output_surface_for_resource(false), | 175 resource_type(HAS_RESOURCE), |
| 176 resource_id(0), | |
| 177 plane_z_order(0), | 176 plane_z_order(0), |
| 178 overlay_handled(false) {} | 177 overlay_handled(false) {} |
| 179 | 178 |
| 180 OverlayCandidate::~OverlayCandidate() {} | 179 OverlayCandidate::~OverlayCandidate() {} |
| 181 | 180 |
| 182 // static | 181 // static |
| 183 bool OverlayCandidate::FromDrawQuad(ResourceProvider* resource_provider, | 182 bool OverlayCandidate::FromDrawQuad(ResourceProvider* resource_provider, |
| 184 const DrawQuad* quad, | 183 const DrawQuad* quad, |
| 185 OverlayCandidate* candidate) { | 184 OverlayCandidate* candidate) { |
| 186 if (quad->needs_blending || quad->shared_quad_state->opacity != 1.f || | 185 if (quad->needs_blending || quad->shared_quad_state->opacity != 1.f || |
| (...skipping 14 matching lines...) Expand all Loading... |
| 201 case DrawQuad::TEXTURE_CONTENT: | 200 case DrawQuad::TEXTURE_CONTENT: |
| 202 return FromTextureQuad(resource_provider, | 201 return FromTextureQuad(resource_provider, |
| 203 TextureDrawQuad::MaterialCast(quad), candidate); | 202 TextureDrawQuad::MaterialCast(quad), candidate); |
| 204 case DrawQuad::STREAM_VIDEO_CONTENT: | 203 case DrawQuad::STREAM_VIDEO_CONTENT: |
| 205 return FromStreamVideoQuad(resource_provider, | 204 return FromStreamVideoQuad(resource_provider, |
| 206 StreamVideoDrawQuad::MaterialCast(quad), | 205 StreamVideoDrawQuad::MaterialCast(quad), |
| 207 candidate); | 206 candidate); |
| 208 case DrawQuad::IO_SURFACE_CONTENT: | 207 case DrawQuad::IO_SURFACE_CONTENT: |
| 209 return FromIOSurfaceQuad( | 208 return FromIOSurfaceQuad( |
| 210 resource_provider, IOSurfaceDrawQuad::MaterialCast(quad), candidate); | 209 resource_provider, IOSurfaceDrawQuad::MaterialCast(quad), candidate); |
| 210 case DrawQuad::TILED_CONTENT: |
| 211 return FromTileQuad(resource_provider, TileDrawQuad::MaterialCast(quad), |
| 212 candidate); |
| 213 case DrawQuad::SOLID_COLOR: |
| 214 return FromSolidColorQuad(SolidColorDrawQuad::MaterialCast(quad), |
| 215 candidate); |
| 211 default: | 216 default: |
| 212 break; | 217 break; |
| 213 } | 218 } |
| 214 | 219 |
| 215 return false; | 220 return false; |
| 216 } | 221 } |
| 217 | 222 |
| 218 // static | 223 // static |
| 219 bool OverlayCandidate::IsInvisibleQuad(const DrawQuad* quad) { | 224 bool OverlayCandidate::IsInvisibleQuad(const DrawQuad* quad) { |
| 220 if (quad->material == DrawQuad::SOLID_COLOR) { | 225 if (quad->material == DrawQuad::SOLID_COLOR) { |
| 221 SkColor color = SolidColorDrawQuad::MaterialCast(quad)->color; | 226 SkColor color = SolidColorDrawQuad::MaterialCast(quad)->color; |
| 222 float opacity = quad->shared_quad_state->opacity; | 227 float opacity = quad->shared_quad_state->opacity; |
| 223 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; | 228 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; |
| 224 return quad->ShouldDrawWithBlending() && | 229 return quad->ShouldDrawWithBlending() && |
| 225 alpha < std::numeric_limits<float>::epsilon(); | 230 alpha < std::numeric_limits<float>::epsilon(); |
| 226 } | 231 } |
| 227 return false; | 232 return false; |
| 228 } | 233 } |
| 229 | 234 |
| 230 // static | 235 // static |
| 231 bool OverlayCandidate::FromTextureQuad(ResourceProvider* resource_provider, | 236 bool OverlayCandidate::FromTextureQuad(ResourceProvider* resource_provider, |
| 232 const TextureDrawQuad* quad, | 237 const TextureDrawQuad* quad, |
| 233 OverlayCandidate* candidate) { | 238 OverlayCandidate* candidate) { |
| 234 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) | 239 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 235 return false; | 240 return false; |
| 236 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 241 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 237 quad->shared_quad_state->quad_to_target_transform, quad->y_flipped); | 242 quad->shared_quad_state->quad_to_target_transform, quad->y_flipped); |
| 238 if (quad->background_color != SK_ColorTRANSPARENT || | 243 if (quad->background_color != SK_ColorTRANSPARENT || |
| 239 quad->premultiplied_alpha || | |
| 240 overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | 244 overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| 241 return false; | 245 return false; |
| 242 candidate->resource_id = quad->resource_id(); | 246 candidate->resource.resource_id = quad->resource_id(); |
| 243 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); | 247 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); |
| 244 candidate->transform = overlay_transform; | 248 candidate->transform = overlay_transform; |
| 245 candidate->uv_rect = BoundingRect(quad->uv_top_left, quad->uv_bottom_right); | 249 candidate->uv_rect = BoundingRect(quad->uv_top_left, quad->uv_bottom_right); |
| 246 return true; | 250 return true; |
| 247 } | 251 } |
| 248 | 252 |
| 249 // static | 253 // static |
| 250 bool OverlayCandidate::FromStreamVideoQuad(ResourceProvider* resource_provider, | 254 bool OverlayCandidate::FromStreamVideoQuad(ResourceProvider* resource_provider, |
| 251 const StreamVideoDrawQuad* quad, | 255 const StreamVideoDrawQuad* quad, |
| 252 OverlayCandidate* candidate) { | 256 OverlayCandidate* candidate) { |
| 253 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) | 257 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 254 return false; | 258 return false; |
| 255 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 259 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 256 quad->shared_quad_state->quad_to_target_transform, false); | 260 quad->shared_quad_state->quad_to_target_transform, false); |
| 257 if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | 261 if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) |
| 258 return false; | 262 return false; |
| 259 if (!quad->matrix.IsScaleOrTranslation()) { | 263 if (!quad->matrix.IsScaleOrTranslation()) { |
| 260 // We cannot handle anything other than scaling & translation for texture | 264 // We cannot handle anything other than scaling & translation for texture |
| 261 // coordinates yet. | 265 // coordinates yet. |
| 262 return false; | 266 return false; |
| 263 } | 267 } |
| 264 candidate->resource_id = quad->resource_id(); | 268 candidate->resource.resource_id = quad->resource_id(); |
| 265 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); | 269 candidate->resource_size_in_pixels = quad->resource_size_in_pixels(); |
| 266 candidate->transform = overlay_transform; | 270 candidate->transform = overlay_transform; |
| 267 | 271 |
| 268 gfx::Point3F uv0 = gfx::Point3F(0, 0, 0); | 272 gfx::Point3F uv0 = gfx::Point3F(0, 0, 0); |
| 269 gfx::Point3F uv1 = gfx::Point3F(1, 1, 0); | 273 gfx::Point3F uv1 = gfx::Point3F(1, 1, 0); |
| 270 quad->matrix.TransformPoint(&uv0); | 274 quad->matrix.TransformPoint(&uv0); |
| 271 quad->matrix.TransformPoint(&uv1); | 275 quad->matrix.TransformPoint(&uv1); |
| 272 gfx::Vector3dF delta = uv1 - uv0; | 276 gfx::Vector3dF delta = uv1 - uv0; |
| 273 if (delta.x() < 0) { | 277 if (delta.x() < 0) { |
| 274 candidate->transform = ComposeTransforms( | 278 candidate->transform = ComposeTransforms( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 295 // static | 299 // static |
| 296 bool OverlayCandidate::FromIOSurfaceQuad(ResourceProvider* resource_provider, | 300 bool OverlayCandidate::FromIOSurfaceQuad(ResourceProvider* resource_provider, |
| 297 const IOSurfaceDrawQuad* quad, | 301 const IOSurfaceDrawQuad* quad, |
| 298 OverlayCandidate* candidate) { | 302 OverlayCandidate* candidate) { |
| 299 if (!resource_provider->IsOverlayCandidate(quad->io_surface_resource_id())) | 303 if (!resource_provider->IsOverlayCandidate(quad->io_surface_resource_id())) |
| 300 return false; | 304 return false; |
| 301 gfx::OverlayTransform overlay_transform = GetOverlayTransform( | 305 gfx::OverlayTransform overlay_transform = GetOverlayTransform( |
| 302 quad->shared_quad_state->quad_to_target_transform, false); | 306 quad->shared_quad_state->quad_to_target_transform, false); |
| 303 if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) | 307 if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) |
| 304 return false; | 308 return false; |
| 305 candidate->resource_id = quad->io_surface_resource_id(); | 309 candidate->resource.resource_id = quad->io_surface_resource_id(); |
| 306 candidate->resource_size_in_pixels = quad->io_surface_size; | 310 candidate->resource_size_in_pixels = quad->io_surface_size; |
| 307 candidate->transform = overlay_transform; | 311 candidate->transform = overlay_transform; |
| 308 candidate->uv_rect = gfx::RectF(1.f, 1.f); | 312 candidate->uv_rect = gfx::RectF(1.f, 1.f); |
| 309 return true; | 313 return true; |
| 310 } | 314 } |
| 311 | 315 |
| 316 // static |
| 317 bool OverlayCandidate::FromTileQuad(ResourceProvider* resource_provider, |
| 318 const TileDrawQuad* quad, |
| 319 OverlayCandidate* candidate) { |
| 320 if (!resource_provider->IsOverlayCandidate(quad->resource_id())) |
| 321 return false; |
| 322 candidate->transform = GetOverlayTransform( |
| 323 quad->shared_quad_state->quad_to_target_transform, false); |
| 324 if (candidate->transform != gfx::OVERLAY_TRANSFORM_NONE) |
| 325 return false; |
| 326 candidate->resource.resource_id = quad->resource_id(); |
| 327 candidate->resource_size_in_pixels = quad->texture_size; |
| 328 candidate->uv_rect = quad->tex_coord_rect; |
| 329 candidate->uv_rect.Scale(1.f / quad->texture_size.width(), |
| 330 1.f / quad->texture_size.height()); |
| 331 return true; |
| 332 } |
| 333 |
| 334 // static |
| 335 bool OverlayCandidate::FromSolidColorQuad(const SolidColorDrawQuad* quad, |
| 336 OverlayCandidate* candidate) { |
| 337 candidate->transform = GetOverlayTransform( |
| 338 quad->shared_quad_state->quad_to_target_transform, false); |
| 339 if (candidate->transform != gfx::OVERLAY_TRANSFORM_NONE) |
| 340 return false; |
| 341 candidate->resource_type = SOLID_COLOR; |
| 342 candidate->resource.solid_color = quad->color; |
| 343 return true; |
| 344 } |
| 345 |
| 312 } // namespace cc | 346 } // namespace cc |
| OLD | NEW |