| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/layers/picture_layer_impl.h" | 5 #include "cc/layers/picture_layer_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 } | 725 } |
| 726 | 726 |
| 727 const PictureLayerTiling* PictureLayerImpl::GetPendingOrActiveTwinTiling( | 727 const PictureLayerTiling* PictureLayerImpl::GetPendingOrActiveTwinTiling( |
| 728 const PictureLayerTiling* tiling) const { | 728 const PictureLayerTiling* tiling) const { |
| 729 PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer(); | 729 PictureLayerImpl* twin_layer = GetPendingOrActiveTwinLayer(); |
| 730 if (!twin_layer) | 730 if (!twin_layer) |
| 731 return nullptr; | 731 return nullptr; |
| 732 const PictureLayerTiling* twin_tiling = | 732 const PictureLayerTiling* twin_tiling = |
| 733 twin_layer->tilings_->FindTilingWithScaleKey( | 733 twin_layer->tilings_->FindTilingWithScaleKey( |
| 734 tiling->contents_scale_key()); | 734 tiling->contents_scale_key()); |
| 735 DCHECK(tiling->raster_transform().translation() == gfx::Vector2dF()); | 735 if (twin_tiling && |
| 736 DCHECK(!twin_tiling || | 736 twin_tiling->raster_transform() == tiling->raster_transform()) |
| 737 twin_tiling->raster_transform().translation() == gfx::Vector2dF()); | 737 return twin_tiling; |
| 738 return twin_tiling; | 738 return nullptr; |
| 739 } | 739 } |
| 740 | 740 |
| 741 bool PictureLayerImpl::RequiresHighResToDraw() const { | 741 bool PictureLayerImpl::RequiresHighResToDraw() const { |
| 742 return layer_tree_impl()->RequiresHighResToDraw(); | 742 return layer_tree_impl()->RequiresHighResToDraw(); |
| 743 } | 743 } |
| 744 | 744 |
| 745 gfx::Rect PictureLayerImpl::GetEnclosingRectInTargetSpace() const { | 745 gfx::Rect PictureLayerImpl::GetEnclosingRectInTargetSpace() const { |
| 746 return GetScaledEnclosingRectInTargetSpace(MaximumTilingContentsScale()); | 746 return GetScaledEnclosingRectInTargetSpace(MaximumTilingContentsScale()); |
| 747 } | 747 } |
| 748 | 748 |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 } | 884 } |
| 885 | 885 |
| 886 void PictureLayerImpl::SetUseTransformedRasterization(bool use) { | 886 void PictureLayerImpl::SetUseTransformedRasterization(bool use) { |
| 887 if (use_transformed_rasterization_ == use) | 887 if (use_transformed_rasterization_ == use) |
| 888 return; | 888 return; |
| 889 | 889 |
| 890 use_transformed_rasterization_ = use; | 890 use_transformed_rasterization_ = use; |
| 891 NoteLayerPropertyChanged(); | 891 NoteLayerPropertyChanged(); |
| 892 } | 892 } |
| 893 | 893 |
| 894 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) { | 894 PictureLayerTiling* PictureLayerImpl::AddTiling( |
| 895 const ScaleTranslate2d& contents_transform) { |
| 895 DCHECK(CanHaveTilings()); | 896 DCHECK(CanHaveTilings()); |
| 896 DCHECK_GE(contents_scale, MinimumContentsScale()); | 897 DCHECK_GE(contents_transform.scale(), MinimumContentsScale()); |
| 897 DCHECK_LE(contents_scale, MaximumContentsScale()); | 898 DCHECK_LE(contents_transform.scale(), MaximumContentsScale()); |
| 898 DCHECK(raster_source_->HasRecordings()); | 899 DCHECK(raster_source_->HasRecordings()); |
| 899 return tilings_->AddTiling(ScaleTranslate2d(contents_scale, gfx::Vector2dF()), | 900 return tilings_->AddTiling(contents_transform, raster_source_); |
| 900 raster_source_); | |
| 901 } | 901 } |
| 902 | 902 |
| 903 void PictureLayerImpl::RemoveAllTilings() { | 903 void PictureLayerImpl::RemoveAllTilings() { |
| 904 tilings_->RemoveAllTilings(); | 904 tilings_->RemoveAllTilings(); |
| 905 // If there are no tilings, then raster scales are no longer meaningful. | 905 // If there are no tilings, then raster scales are no longer meaningful. |
| 906 ResetRasterScale(); | 906 ResetRasterScale(); |
| 907 } | 907 } |
| 908 | 908 |
| 909 void PictureLayerImpl::AddTilingsForRasterScale() { | 909 void PictureLayerImpl::AddTilingsForRasterScale() { |
| 910 // Reset all resolution enums on tilings, we'll be setting new values in this | 910 // Reset all resolution enums on tilings, we'll be setting new values in this |
| 911 // function. | 911 // function. |
| 912 tilings_->MarkAllTilingsNonIdeal(); | 912 tilings_->MarkAllTilingsNonIdeal(); |
| 913 | 913 |
| 914 PictureLayerTiling* high_res = | 914 PictureLayerTiling* high_res = |
| 915 tilings_->FindTilingWithScaleKey(raster_contents_scale_); | 915 tilings_->FindTilingWithScaleKey(raster_contents_scale_); |
| 916 gfx::Vector2dF raster_translation = |
| 917 CalculateRasterTranslation(raster_contents_scale_); |
| 918 if (high_res && |
| 919 high_res->raster_transform().translation() != raster_translation) { |
| 920 tilings_->Remove(high_res); |
| 921 high_res = nullptr; |
| 922 } |
| 916 if (!high_res) { | 923 if (!high_res) { |
| 917 // We always need a high res tiling, so create one if it doesn't exist. | 924 // We always need a high res tiling, so create one if it doesn't exist. |
| 918 high_res = AddTiling(raster_contents_scale_); | 925 high_res = |
| 926 AddTiling(ScaleTranslate2d(raster_contents_scale_, raster_translation)); |
| 919 } else if (high_res->may_contain_low_resolution_tiles()) { | 927 } else if (high_res->may_contain_low_resolution_tiles()) { |
| 920 // If the tiling we find here was LOW_RESOLUTION previously, it may not be | 928 // If the tiling we find here was LOW_RESOLUTION previously, it may not be |
| 921 // fully rastered, so destroy the old tiles. | 929 // fully rastered, so destroy the old tiles. |
| 922 high_res->Reset(); | 930 high_res->Reset(); |
| 923 // Reset the flag now that we'll make it high res, it will have fully | 931 // Reset the flag now that we'll make it high res, it will have fully |
| 924 // rastered content. | 932 // rastered content. |
| 925 high_res->reset_may_contain_low_resolution_tiles(); | 933 high_res->reset_may_contain_low_resolution_tiles(); |
| 926 } | 934 } |
| 927 high_res->set_resolution(HIGH_RESOLUTION); | 935 high_res->set_resolution(HIGH_RESOLUTION); |
| 928 | 936 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1005 tilings_->FindTilingWithScaleKey(low_res_raster_contents_scale_); | 1013 tilings_->FindTilingWithScaleKey(low_res_raster_contents_scale_); |
| 1006 DCHECK(!low_res || low_res->resolution() != HIGH_RESOLUTION); | 1014 DCHECK(!low_res || low_res->resolution() != HIGH_RESOLUTION); |
| 1007 | 1015 |
| 1008 // Only create new low res tilings when the transform is static. This | 1016 // Only create new low res tilings when the transform is static. This |
| 1009 // prevents wastefully creating a paired low res tiling for every new high | 1017 // prevents wastefully creating a paired low res tiling for every new high |
| 1010 // res tiling during a pinch or a CSS animation. | 1018 // res tiling during a pinch or a CSS animation. |
| 1011 bool is_pinching = layer_tree_impl()->PinchGestureActive(); | 1019 bool is_pinching = layer_tree_impl()->PinchGestureActive(); |
| 1012 bool is_animating = draw_properties().screen_space_transform_is_animating; | 1020 bool is_animating = draw_properties().screen_space_transform_is_animating; |
| 1013 if (!is_pinching && !is_animating) { | 1021 if (!is_pinching && !is_animating) { |
| 1014 if (!low_res) | 1022 if (!low_res) |
| 1015 low_res = AddTiling(low_res_raster_contents_scale_); | 1023 low_res = AddTiling( |
| 1024 ScaleTranslate2d(low_res_raster_contents_scale_, gfx::Vector2dF())); |
| 1016 low_res->set_resolution(LOW_RESOLUTION); | 1025 low_res->set_resolution(LOW_RESOLUTION); |
| 1017 } | 1026 } |
| 1018 } | 1027 } |
| 1019 | 1028 |
| 1020 void PictureLayerImpl::RecalculateRasterScales() { | 1029 void PictureLayerImpl::RecalculateRasterScales() { |
| 1021 if (is_directly_composited_image_) { | 1030 if (is_directly_composited_image_) { |
| 1022 if (!raster_source_scale_) | 1031 if (!raster_source_scale_) |
| 1023 raster_source_scale_ = 1.f; | 1032 raster_source_scale_ = 1.f; |
| 1024 | 1033 |
| 1025 float min_scale = MinimumContentsScale(); | 1034 float min_scale = MinimumContentsScale(); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 } | 1180 } |
| 1172 | 1181 |
| 1173 PictureLayerTilingSet* twin_set = twin ? twin->tilings_.get() : nullptr; | 1182 PictureLayerTilingSet* twin_set = twin ? twin->tilings_.get() : nullptr; |
| 1174 tilings_->CleanUpTilings(min_acceptable_high_res_scale, | 1183 tilings_->CleanUpTilings(min_acceptable_high_res_scale, |
| 1175 max_acceptable_high_res_scale, used_tilings, | 1184 max_acceptable_high_res_scale, used_tilings, |
| 1176 twin_set); | 1185 twin_set); |
| 1177 DCHECK_GT(tilings_->num_tilings(), 0u); | 1186 DCHECK_GT(tilings_->num_tilings(), 0u); |
| 1178 SanityCheckTilingState(); | 1187 SanityCheckTilingState(); |
| 1179 } | 1188 } |
| 1180 | 1189 |
| 1190 gfx::Vector2dF PictureLayerImpl::CalculateRasterTranslation( |
| 1191 float raster_scale) { |
| 1192 if (!use_transformed_rasterization_) |
| 1193 return gfx::Vector2dF(); |
| 1194 |
| 1195 DCHECK(!draw_properties().screen_space_transform_is_animating); |
| 1196 gfx::Transform draw_transform = DrawTransform(); |
| 1197 DCHECK(draw_transform.IsScaleOrTranslation()); |
| 1198 |
| 1199 // It is only useful to align the content space to the target space if their |
| 1200 // relative pixel ratio is some small rational number. Currently we only |
| 1201 // align if the relative pixel ratio is 1:1. |
| 1202 // Good match if the maximum alignment error on a layer of size 10000px |
| 1203 // does not exceed 0.001px. |
| 1204 static constexpr float kErrorThreshold = 0.0000001f; |
| 1205 if (std::abs(draw_transform.matrix().getFloat(0, 0) - raster_scale) > |
| 1206 kErrorThreshold || |
| 1207 std::abs(draw_transform.matrix().getFloat(1, 1) - raster_scale) > |
| 1208 kErrorThreshold) |
| 1209 return gfx::Vector2dF(); |
| 1210 |
| 1211 // Extract the fractional part of layer origin in the target space. |
| 1212 float origin_x = draw_transform.matrix().getFloat(0, 3); |
| 1213 float origin_y = draw_transform.matrix().getFloat(1, 3); |
| 1214 return gfx::Vector2dF(origin_x - floorf(origin_x), |
| 1215 origin_y - floorf(origin_y)); |
| 1216 } |
| 1217 |
| 1181 float PictureLayerImpl::MinimumContentsScale() const { | 1218 float PictureLayerImpl::MinimumContentsScale() const { |
| 1182 float setting_min = layer_tree_impl()->settings().minimum_contents_scale; | 1219 float setting_min = layer_tree_impl()->settings().minimum_contents_scale; |
| 1183 | 1220 |
| 1184 // If the contents scale is less than 1 / width (also for height), | 1221 // If the contents scale is less than 1 / width (also for height), |
| 1185 // then it will end up having less than one pixel of content in that | 1222 // then it will end up having less than one pixel of content in that |
| 1186 // dimension. Bump the minimum contents scale up in this case to prevent | 1223 // dimension. Bump the minimum contents scale up in this case to prevent |
| 1187 // this from happening. | 1224 // this from happening. |
| 1188 int min_dimension = std::min(raster_source_->GetSize().width(), | 1225 int min_dimension = std::min(raster_source_->GetSize().width(), |
| 1189 raster_source_->GetSize().height()); | 1226 raster_source_->GetSize().height()); |
| 1190 if (!min_dimension) | 1227 if (!min_dimension) |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 } | 1449 } |
| 1413 | 1450 |
| 1414 invalidation_.Union(invalidation); | 1451 invalidation_.Union(invalidation); |
| 1415 tilings_->UpdateTilingsForImplSideInvalidation(invalidation); | 1452 tilings_->UpdateTilingsForImplSideInvalidation(invalidation); |
| 1416 SetNeedsPushProperties(); | 1453 SetNeedsPushProperties(); |
| 1417 TRACE_EVENT_END1("cc", "PictureLayerImpl::InvalidateRegionForImages", | 1454 TRACE_EVENT_END1("cc", "PictureLayerImpl::InvalidateRegionForImages", |
| 1418 "Invalidation", invalidation.ToString()); | 1455 "Invalidation", invalidation.ToString()); |
| 1419 } | 1456 } |
| 1420 | 1457 |
| 1421 } // namespace cc | 1458 } // namespace cc |
| OLD | NEW |