| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_strategy_common.h" | 5 #include "cc/output/overlay_strategy_common.h" |
| 6 | 6 |
| 7 #include <limits> | |
| 8 | |
| 9 #include "cc/base/math_util.h" | |
| 10 #include "cc/quads/io_surface_draw_quad.h" | |
| 11 #include "cc/quads/solid_color_draw_quad.h" | 7 #include "cc/quads/solid_color_draw_quad.h" |
| 12 #include "cc/quads/stream_video_draw_quad.h" | |
| 13 #include "cc/quads/texture_draw_quad.h" | |
| 14 #include "cc/resources/resource_provider.h" | |
| 15 #include "ui/gfx/geometry/point3_f.h" | |
| 16 #include "ui/gfx/geometry/rect_conversions.h" | |
| 17 #include "ui/gfx/transform.h" | |
| 18 | 8 |
| 19 namespace cc { | 9 namespace cc { |
| 20 | 10 |
| 21 OverlayStrategyCommon::OverlayStrategyCommon( | 11 OverlayStrategyCommon::OverlayStrategyCommon( |
| 22 OverlayCandidateValidator* capability_checker, | 12 OverlayCandidateValidator* capability_checker, |
| 23 OverlayStrategyCommonDelegate* delegate) | 13 OverlayStrategyCommonDelegate* delegate) |
| 24 : capability_checker_(capability_checker), delegate_(delegate) {} | 14 : capability_checker_(capability_checker), delegate_(delegate) {} |
| 25 | 15 |
| 26 OverlayStrategyCommon::~OverlayStrategyCommon() { | 16 OverlayStrategyCommon::~OverlayStrategyCommon() { |
| 27 } | 17 } |
| 28 | 18 |
| 29 bool OverlayStrategyCommon::Attempt(RenderPassList* render_passes_in_draw_order, | 19 bool OverlayStrategyCommon::Attempt(RenderPassList* render_passes_in_draw_order, |
| 30 OverlayCandidateList* candidate_list, | 20 OverlayCandidateList* candidate_list, |
| 31 float device_scale_factor) { | 21 float device_scale_factor) { |
| 32 if (!capability_checker_) | 22 if (!capability_checker_) |
| 33 return false; | 23 return false; |
| 34 RenderPass* root_render_pass = render_passes_in_draw_order->back(); | 24 RenderPass* root_render_pass = render_passes_in_draw_order->back(); |
| 35 DCHECK(root_render_pass); | 25 DCHECK(root_render_pass); |
| 36 | 26 |
| 37 // Add our primary surface. | 27 // Add our primary surface. |
| 38 OverlayCandidate main_image; | 28 OverlayCandidate main_image; |
| 39 main_image.display_rect = gfx::RectF(root_render_pass->output_rect); | 29 main_image.display_rect = gfx::RectF(root_render_pass->output_rect); |
| 40 DCHECK(candidate_list->empty()); | 30 DCHECK(candidate_list->empty()); |
| 41 candidate_list->push_back(main_image); | 31 candidate_list->push_back(main_image); |
| 42 | 32 |
| 43 bool created_overlay = false; | 33 bool created_overlay = false; |
| 44 QuadList& quad_list = root_render_pass->quad_list; | 34 QuadList& quad_list = root_render_pass->quad_list; |
| 45 for (auto it = quad_list.begin(); it != quad_list.end();) { | 35 for (auto it = quad_list.begin(); it != quad_list.end();) { |
| 46 OverlayCandidate candidate; | 36 OverlayCandidate candidate; |
| 47 if (!GetCandidateQuadInfo(**it, &candidate)) { | 37 if (!OverlayCandidate::FromDrawQuad(*it, &candidate)) { |
| 48 ++it; | 38 ++it; |
| 49 continue; | 39 continue; |
| 50 } | 40 } |
| 51 | 41 |
| 52 OverlayResult result = delegate_->TryOverlay( | 42 OverlayResult result = delegate_->TryOverlay( |
| 53 capability_checker_, render_passes_in_draw_order, candidate_list, | 43 capability_checker_, render_passes_in_draw_order, candidate_list, |
| 54 candidate, &it, device_scale_factor); | 44 candidate, &it, device_scale_factor); |
| 55 switch (result) { | 45 switch (result) { |
| 56 case DID_NOT_CREATE_OVERLAY: | 46 case DID_NOT_CREATE_OVERLAY: |
| 57 ++it; | 47 ++it; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 79 SolidColorDrawQuad::MaterialCast(draw_quad); | 69 SolidColorDrawQuad::MaterialCast(draw_quad); |
| 80 SkColor color = solid_quad->color; | 70 SkColor color = solid_quad->color; |
| 81 float opacity = solid_quad->shared_quad_state->opacity; | 71 float opacity = solid_quad->shared_quad_state->opacity; |
| 82 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; | 72 float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity; |
| 83 return solid_quad->ShouldDrawWithBlending() && | 73 return solid_quad->ShouldDrawWithBlending() && |
| 84 alpha < std::numeric_limits<float>::epsilon(); | 74 alpha < std::numeric_limits<float>::epsilon(); |
| 85 } | 75 } |
| 86 return false; | 76 return false; |
| 87 } | 77 } |
| 88 | 78 |
| 89 bool OverlayStrategyCommon::GetTextureQuadInfo(const TextureDrawQuad& quad, | |
| 90 OverlayCandidate* quad_info) { | |
| 91 if (!quad.allow_overlay()) | |
| 92 return false; | |
| 93 gfx::OverlayTransform overlay_transform = | |
| 94 OverlayCandidate::GetOverlayTransform( | |
| 95 quad.shared_quad_state->quad_to_target_transform, quad.y_flipped); | |
| 96 if (quad.background_color != SK_ColorTRANSPARENT || | |
| 97 quad.premultiplied_alpha || | |
| 98 overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | |
| 99 return false; | |
| 100 quad_info->resource_id = quad.resource_id(); | |
| 101 quad_info->resource_size_in_pixels = quad.resource_size_in_pixels(); | |
| 102 quad_info->transform = overlay_transform; | |
| 103 quad_info->uv_rect = BoundingRect(quad.uv_top_left, quad.uv_bottom_right); | |
| 104 return true; | |
| 105 } | |
| 106 | |
| 107 bool OverlayStrategyCommon::GetVideoQuadInfo(const StreamVideoDrawQuad& quad, | |
| 108 OverlayCandidate* quad_info) { | |
| 109 if (!quad.allow_overlay()) | |
| 110 return false; | |
| 111 gfx::OverlayTransform overlay_transform = | |
| 112 OverlayCandidate::GetOverlayTransform( | |
| 113 quad.shared_quad_state->quad_to_target_transform, false); | |
| 114 if (overlay_transform == gfx::OVERLAY_TRANSFORM_INVALID) | |
| 115 return false; | |
| 116 if (!quad.matrix.IsScaleOrTranslation()) { | |
| 117 // We cannot handle anything other than scaling & translation for texture | |
| 118 // coordinates yet. | |
| 119 return false; | |
| 120 } | |
| 121 quad_info->resource_id = quad.resource_id(); | |
| 122 quad_info->resource_size_in_pixels = quad.resource_size_in_pixels(); | |
| 123 quad_info->transform = overlay_transform; | |
| 124 | |
| 125 gfx::Point3F uv0 = gfx::Point3F(0, 0, 0); | |
| 126 gfx::Point3F uv1 = gfx::Point3F(1, 1, 0); | |
| 127 quad.matrix.TransformPoint(&uv0); | |
| 128 quad.matrix.TransformPoint(&uv1); | |
| 129 gfx::Vector3dF delta = uv1 - uv0; | |
| 130 if (delta.x() < 0) { | |
| 131 quad_info->transform = OverlayCandidate::ModifyTransform( | |
| 132 quad_info->transform, gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL); | |
| 133 float x0 = uv0.x(); | |
| 134 uv0.set_x(uv1.x()); | |
| 135 uv1.set_x(x0); | |
| 136 delta.set_x(-delta.x()); | |
| 137 } | |
| 138 | |
| 139 if (delta.y() < 0) { | |
| 140 // In this situation, uv0y < uv1y. Since we overlay inverted, a request | |
| 141 // to invert the source texture means we can just output the texture | |
| 142 // normally and it will be correct. | |
| 143 quad_info->uv_rect = gfx::RectF(uv0.x(), uv1.y(), delta.x(), -delta.y()); | |
| 144 } else { | |
| 145 quad_info->transform = OverlayCandidate::ModifyTransform( | |
| 146 quad_info->transform, gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL); | |
| 147 quad_info->uv_rect = gfx::RectF(uv0.x(), uv0.y(), delta.x(), delta.y()); | |
| 148 } | |
| 149 return true; | |
| 150 } | |
| 151 | |
| 152 bool OverlayStrategyCommon::GetIOSurfaceQuadInfo(const IOSurfaceDrawQuad& quad, | |
| 153 OverlayCandidate* quad_info) { | |
| 154 if (!quad.allow_overlay) | |
| 155 return false; | |
| 156 gfx::OverlayTransform overlay_transform = | |
| 157 OverlayCandidate::GetOverlayTransform( | |
| 158 quad.shared_quad_state->quad_to_target_transform, false); | |
| 159 if (overlay_transform != gfx::OVERLAY_TRANSFORM_NONE) | |
| 160 return false; | |
| 161 quad_info->resource_id = quad.io_surface_resource_id(); | |
| 162 quad_info->resource_size_in_pixels = quad.io_surface_size; | |
| 163 quad_info->transform = overlay_transform; | |
| 164 quad_info->uv_rect = gfx::RectF(1.f, 1.f); | |
| 165 return true; | |
| 166 } | |
| 167 | |
| 168 bool OverlayStrategyCommon::GetCandidateQuadInfo(const DrawQuad& draw_quad, | |
| 169 OverlayCandidate* quad_info) { | |
| 170 // All quad checks. | |
| 171 if (draw_quad.needs_blending || draw_quad.shared_quad_state->opacity != 1.f || | |
| 172 draw_quad.shared_quad_state->blend_mode != SkXfermode::kSrcOver_Mode) | |
| 173 return false; | |
| 174 | |
| 175 switch (draw_quad.material) { | |
| 176 case DrawQuad::TEXTURE_CONTENT: { | |
| 177 auto* quad = TextureDrawQuad::MaterialCast(&draw_quad); | |
| 178 if (!GetTextureQuadInfo(*quad, quad_info)) | |
| 179 return false; | |
| 180 } break; | |
| 181 case DrawQuad::STREAM_VIDEO_CONTENT: { | |
| 182 auto* quad = StreamVideoDrawQuad::MaterialCast(&draw_quad); | |
| 183 if (!GetVideoQuadInfo(*quad, quad_info)) | |
| 184 return false; | |
| 185 } break; | |
| 186 case DrawQuad::IO_SURFACE_CONTENT: { | |
| 187 auto* quad = IOSurfaceDrawQuad::MaterialCast(&draw_quad); | |
| 188 if (!GetIOSurfaceQuadInfo(*quad, quad_info)) | |
| 189 return false; | |
| 190 } break; | |
| 191 default: | |
| 192 return false; | |
| 193 } | |
| 194 | |
| 195 quad_info->format = RGBA_8888; | |
| 196 quad_info->display_rect = OverlayCandidate::GetOverlayRect( | |
| 197 draw_quad.shared_quad_state->quad_to_target_transform, draw_quad.rect); | |
| 198 quad_info->quad_rect_in_target_space = MathUtil::MapEnclosingClippedRect( | |
| 199 draw_quad.shared_quad_state->quad_to_target_transform, draw_quad.rect); | |
| 200 quad_info->clip_rect = draw_quad.shared_quad_state->clip_rect; | |
| 201 quad_info->is_clipped = draw_quad.shared_quad_state->is_clipped; | |
| 202 return true; | |
| 203 } | |
| 204 | |
| 205 } // namespace cc | 79 } // namespace cc |
| OLD | NEW |