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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, | 62 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, |
63 int id, | 63 int id, |
64 bool is_mask) | 64 bool is_mask) |
65 : LayerImpl(tree_impl, id), | 65 : LayerImpl(tree_impl, id), |
66 twin_layer_(nullptr), | 66 twin_layer_(nullptr), |
67 tilings_(CreatePictureLayerTilingSet()), | 67 tilings_(CreatePictureLayerTilingSet()), |
68 ideal_page_scale_(0.f), | 68 ideal_page_scale_(0.f), |
69 ideal_device_scale_(0.f), | 69 ideal_device_scale_(0.f), |
70 ideal_source_scale_(0.f), | 70 ideal_source_scale_(0.f), |
71 ideal_contents_scale_(0.f), | 71 ideal_contents_scale_(0.f), |
72 last_ideal_source_scale_(0.f), | |
73 raster_page_scale_(0.f), | 72 raster_page_scale_(0.f), |
74 raster_device_scale_(0.f), | 73 raster_device_scale_(0.f), |
75 raster_source_scale_(0.f), | 74 raster_source_scale_(0.f), |
76 raster_contents_scale_(0.f), | 75 raster_contents_scale_(0.f), |
77 low_res_raster_contents_scale_(0.f), | 76 low_res_raster_contents_scale_(0.f), |
78 raster_source_scale_is_fixed_(false), | |
79 was_screen_space_transform_animating_(false), | 77 was_screen_space_transform_animating_(false), |
80 only_used_low_res_last_append_quads_(false), | 78 only_used_low_res_last_append_quads_(false), |
81 is_mask_(is_mask), | 79 is_mask_(is_mask), |
82 nearest_neighbor_(false) { | 80 nearest_neighbor_(false) { |
83 layer_tree_impl()->RegisterPictureLayerImpl(this); | 81 layer_tree_impl()->RegisterPictureLayerImpl(this); |
84 } | 82 } |
85 | 83 |
86 PictureLayerImpl::~PictureLayerImpl() { | 84 PictureLayerImpl::~PictureLayerImpl() { |
87 if (twin_layer_) | 85 if (twin_layer_) |
88 twin_layer_->twin_layer_ = nullptr; | 86 twin_layer_->twin_layer_ = nullptr; |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 if (layer_tree_impl()->IsActiveTree()) | 425 if (layer_tree_impl()->IsActiveTree()) |
428 CleanUpTilingsOnActiveLayer(last_append_quads_tilings_); | 426 CleanUpTilingsOnActiveLayer(last_append_quads_tilings_); |
429 | 427 |
430 UpdateIdealScales(); | 428 UpdateIdealScales(); |
431 | 429 |
432 if (!raster_contents_scale_ || ShouldAdjustRasterScale()) { | 430 if (!raster_contents_scale_ || ShouldAdjustRasterScale()) { |
433 RecalculateRasterScales(); | 431 RecalculateRasterScales(); |
434 AddTilingsForRasterScale(); | 432 AddTilingsForRasterScale(); |
435 } | 433 } |
436 | 434 |
437 // Inform layer tree impl if we will have blurry content because of fixed | |
438 // raster scale (note that this check should happen after we | |
439 // ReclaculateRasterScales, since that's the function that will determine | |
440 // whether our raster scale is fixed. | |
441 if (raster_source_scale_is_fixed_ && !has_will_change_transform_hint()) { | |
442 if (raster_source_scale_ != ideal_source_scale_) | |
443 layer_tree_impl()->SetFixedRasterScaleHasBlurryContent(); | |
444 if (ideal_source_scale_ != last_ideal_source_scale_) | |
445 layer_tree_impl()->SetFixedRasterScaleAttemptedToChangeScale(); | |
446 } | |
447 | |
448 if (layer_tree_impl()->IsActiveTree()) | 435 if (layer_tree_impl()->IsActiveTree()) |
449 AddLowResolutionTilingIfNeeded(); | 436 AddLowResolutionTilingIfNeeded(); |
450 | 437 |
451 DCHECK(raster_page_scale_); | 438 DCHECK(raster_page_scale_); |
452 DCHECK(raster_device_scale_); | 439 DCHECK(raster_device_scale_); |
453 DCHECK(raster_source_scale_); | 440 DCHECK(raster_source_scale_); |
454 DCHECK(raster_contents_scale_); | 441 DCHECK(raster_contents_scale_); |
455 DCHECK(low_res_raster_contents_scale_); | 442 DCHECK(low_res_raster_contents_scale_); |
456 | 443 |
457 was_screen_space_transform_animating_ = | 444 was_screen_space_transform_animating_ = |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 if (!is_pinching) { | 895 if (!is_pinching) { |
909 // When not pinching, match the ideal page scale factor. | 896 // When not pinching, match the ideal page scale factor. |
910 if (raster_page_scale_ != ideal_page_scale_) | 897 if (raster_page_scale_ != ideal_page_scale_) |
911 return true; | 898 return true; |
912 } | 899 } |
913 | 900 |
914 // Always match the ideal device scale factor. | 901 // Always match the ideal device scale factor. |
915 if (raster_device_scale_ != ideal_device_scale_) | 902 if (raster_device_scale_ != ideal_device_scale_) |
916 return true; | 903 return true; |
917 | 904 |
918 // When the source scale changes we want to match it, but not when animating | |
919 // or when we've fixed the scale in place. | |
920 if (!draw_properties().screen_space_transform_is_animating && | |
921 !raster_source_scale_is_fixed_ && | |
922 raster_source_scale_ != ideal_source_scale_) | |
923 return true; | |
924 | |
925 if (raster_contents_scale_ > MaximumContentsScale()) | 905 if (raster_contents_scale_ > MaximumContentsScale()) |
926 return true; | 906 return true; |
927 if (raster_contents_scale_ < MinimumContentsScale()) | 907 if (raster_contents_scale_ < MinimumContentsScale()) |
928 return true; | 908 return true; |
929 | 909 |
930 return false; | 910 // Don't change the raster scale if any of the following are true: |
| 911 // - We have an animating transform. |
| 912 // - We have a will-change transform hint. |
| 913 // - The raster scale is already ideal. |
| 914 if (draw_properties().screen_space_transform_is_animating || |
| 915 has_will_change_transform_hint() || |
| 916 raster_source_scale_ == ideal_source_scale_) { |
| 917 return false; |
| 918 } |
| 919 |
| 920 // Match the raster scale in all other cases. |
| 921 return true; |
931 } | 922 } |
932 | 923 |
933 void PictureLayerImpl::AddLowResolutionTilingIfNeeded() { | 924 void PictureLayerImpl::AddLowResolutionTilingIfNeeded() { |
934 DCHECK(layer_tree_impl()->IsActiveTree()); | 925 DCHECK(layer_tree_impl()->IsActiveTree()); |
935 | 926 |
936 if (!layer_tree_impl()->create_low_res_tiling()) | 927 if (!layer_tree_impl()->create_low_res_tiling()) |
937 return; | 928 return; |
938 | 929 |
939 // We should have a high resolution tiling at raster_contents_scale, so if the | 930 // We should have a high resolution tiling at raster_contents_scale, so if the |
940 // low res one is the same then we shouldn't try to override this tiling by | 931 // low res one is the same then we shouldn't try to override this tiling by |
(...skipping 13 matching lines...) Expand all Loading... |
954 if (!is_pinching && !is_animating) { | 945 if (!is_pinching && !is_animating) { |
955 if (!low_res) | 946 if (!low_res) |
956 low_res = AddTiling(low_res_raster_contents_scale_); | 947 low_res = AddTiling(low_res_raster_contents_scale_); |
957 low_res->set_resolution(LOW_RESOLUTION); | 948 low_res->set_resolution(LOW_RESOLUTION); |
958 } | 949 } |
959 } | 950 } |
960 | 951 |
961 void PictureLayerImpl::RecalculateRasterScales() { | 952 void PictureLayerImpl::RecalculateRasterScales() { |
962 float old_raster_contents_scale = raster_contents_scale_; | 953 float old_raster_contents_scale = raster_contents_scale_; |
963 float old_raster_page_scale = raster_page_scale_; | 954 float old_raster_page_scale = raster_page_scale_; |
964 float old_raster_source_scale = raster_source_scale_; | |
965 | 955 |
966 raster_device_scale_ = ideal_device_scale_; | 956 raster_device_scale_ = ideal_device_scale_; |
967 raster_page_scale_ = ideal_page_scale_; | 957 raster_page_scale_ = ideal_page_scale_; |
968 raster_source_scale_ = ideal_source_scale_; | 958 raster_source_scale_ = ideal_source_scale_; |
969 raster_contents_scale_ = ideal_contents_scale_; | 959 raster_contents_scale_ = ideal_contents_scale_; |
970 | 960 |
971 // If we're not animating, or leaving an animation, and the | |
972 // ideal_source_scale_ changes, then things are unpredictable, and we fix | |
973 // the raster_source_scale_ in place. | |
974 if (old_raster_source_scale && | |
975 !draw_properties().screen_space_transform_is_animating && | |
976 !was_screen_space_transform_animating_ && | |
977 old_raster_source_scale != ideal_source_scale_) | |
978 raster_source_scale_is_fixed_ = true; | |
979 | |
980 // TODO(danakj): Adjust raster source scale closer to ideal source scale at | |
981 // a throttled rate. Possibly make use of invalidation_.IsEmpty() on pending | |
982 // tree. This will allow CSS scale changes to get re-rastered at an | |
983 // appropriate rate. (crbug.com/413636) | |
984 if (raster_source_scale_is_fixed_) { | |
985 raster_contents_scale_ /= raster_source_scale_; | |
986 raster_source_scale_ = 1.f; | |
987 } | |
988 | |
989 // During pinch we completely ignore the current ideal scale, and just use | 961 // During pinch we completely ignore the current ideal scale, and just use |
990 // a multiple of the previous scale. | 962 // a multiple of the previous scale. |
991 bool is_pinching = layer_tree_impl()->PinchGestureActive(); | 963 bool is_pinching = layer_tree_impl()->PinchGestureActive(); |
992 if (is_pinching && old_raster_contents_scale) { | 964 if (is_pinching && old_raster_contents_scale) { |
993 // See ShouldAdjustRasterScale: | 965 // See ShouldAdjustRasterScale: |
994 // - When zooming out, preemptively create new tiling at lower resolution. | 966 // - When zooming out, preemptively create new tiling at lower resolution. |
995 // - When zooming in, approximate ideal using multiple of kMaxScaleRatio. | 967 // - When zooming in, approximate ideal using multiple of kMaxScaleRatio. |
996 bool zooming_out = old_raster_page_scale > ideal_page_scale_; | 968 bool zooming_out = old_raster_page_scale > ideal_page_scale_; |
997 float desired_contents_scale = old_raster_contents_scale; | 969 float desired_contents_scale = old_raster_contents_scale; |
998 if (zooming_out) { | 970 if (zooming_out) { |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 // up larger than |max_texture_size|. | 1121 // up larger than |max_texture_size|. |
1150 return nextafterf(max_scale, 0.f); | 1122 return nextafterf(max_scale, 0.f); |
1151 } | 1123 } |
1152 | 1124 |
1153 void PictureLayerImpl::ResetRasterScale() { | 1125 void PictureLayerImpl::ResetRasterScale() { |
1154 raster_page_scale_ = 0.f; | 1126 raster_page_scale_ = 0.f; |
1155 raster_device_scale_ = 0.f; | 1127 raster_device_scale_ = 0.f; |
1156 raster_source_scale_ = 0.f; | 1128 raster_source_scale_ = 0.f; |
1157 raster_contents_scale_ = 0.f; | 1129 raster_contents_scale_ = 0.f; |
1158 low_res_raster_contents_scale_ = 0.f; | 1130 low_res_raster_contents_scale_ = 0.f; |
1159 raster_source_scale_is_fixed_ = false; | |
1160 } | 1131 } |
1161 | 1132 |
1162 bool PictureLayerImpl::CanHaveTilings() const { | 1133 bool PictureLayerImpl::CanHaveTilings() const { |
1163 if (raster_source_->IsSolidColor()) | 1134 if (raster_source_->IsSolidColor()) |
1164 return false; | 1135 return false; |
1165 if (!DrawsContent()) | 1136 if (!DrawsContent()) |
1166 return false; | 1137 return false; |
1167 if (!raster_source_->HasRecordings()) | 1138 if (!raster_source_->HasRecordings()) |
1168 return false; | 1139 return false; |
1169 // If the |raster_source_| has a recording it should have non-empty bounds. | 1140 // If the |raster_source_| has a recording it should have non-empty bounds. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1211 DCHECK(CanHaveTilings()); | 1182 DCHECK(CanHaveTilings()); |
1212 | 1183 |
1213 float min_contents_scale = MinimumContentsScale(); | 1184 float min_contents_scale = MinimumContentsScale(); |
1214 DCHECK_GT(min_contents_scale, 0.f); | 1185 DCHECK_GT(min_contents_scale, 0.f); |
1215 | 1186 |
1216 ideal_page_scale_ = IsAffectedByPageScale() | 1187 ideal_page_scale_ = IsAffectedByPageScale() |
1217 ? layer_tree_impl()->current_page_scale_factor() | 1188 ? layer_tree_impl()->current_page_scale_factor() |
1218 : 1.f; | 1189 : 1.f; |
1219 ideal_device_scale_ = layer_tree_impl()->device_scale_factor(); | 1190 ideal_device_scale_ = layer_tree_impl()->device_scale_factor(); |
1220 ideal_contents_scale_ = std::max(GetIdealContentsScale(), min_contents_scale); | 1191 ideal_contents_scale_ = std::max(GetIdealContentsScale(), min_contents_scale); |
1221 last_ideal_source_scale_ = ideal_source_scale_; | |
1222 ideal_source_scale_ = | 1192 ideal_source_scale_ = |
1223 ideal_contents_scale_ / ideal_page_scale_ / ideal_device_scale_; | 1193 ideal_contents_scale_ / ideal_page_scale_ / ideal_device_scale_; |
1224 } | 1194 } |
1225 | 1195 |
1226 void PictureLayerImpl::GetDebugBorderProperties( | 1196 void PictureLayerImpl::GetDebugBorderProperties( |
1227 SkColor* color, | 1197 SkColor* color, |
1228 float* width) const { | 1198 float* width) const { |
1229 *color = DebugColors::TiledContentLayerBorderColor(); | 1199 *color = DebugColors::TiledContentLayerBorderColor(); |
1230 *width = DebugColors::TiledContentLayerBorderWidth(layer_tree_impl()); | 1200 *width = DebugColors::TiledContentLayerBorderWidth(layer_tree_impl()); |
1231 } | 1201 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { | 1261 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { |
1292 return !layer_tree_impl()->IsRecycleTree(); | 1262 return !layer_tree_impl()->IsRecycleTree(); |
1293 } | 1263 } |
1294 | 1264 |
1295 bool PictureLayerImpl::HasValidTilePriorities() const { | 1265 bool PictureLayerImpl::HasValidTilePriorities() const { |
1296 return IsOnActiveOrPendingTree() && | 1266 return IsOnActiveOrPendingTree() && |
1297 is_drawn_render_surface_layer_list_member(); | 1267 is_drawn_render_surface_layer_list_member(); |
1298 } | 1268 } |
1299 | 1269 |
1300 } // namespace cc | 1270 } // namespace cc |
OLD | NEW |