Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(182)

Side by Side Diff: cc/layers/picture_layer_impl.cc

Issue 2565643002: [5/5] Add translated rasterization for PictureLayerImpl (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/test/fake_picture_layer_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 869 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 } 880 }
881 881
882 void PictureLayerImpl::SetUseTransformedRasterization(bool use) { 882 void PictureLayerImpl::SetUseTransformedRasterization(bool use) {
883 if (use_transformed_rasterization_ == use) 883 if (use_transformed_rasterization_ == use)
884 return; 884 return;
885 885
886 use_transformed_rasterization_ = use; 886 use_transformed_rasterization_ = use;
887 NoteLayerPropertyChanged(); 887 NoteLayerPropertyChanged();
888 } 888 }
889 889
890 PictureLayerTiling* PictureLayerImpl::AddTiling(float contents_scale) { 890 PictureLayerTiling* PictureLayerImpl::AddTiling(const ScaleTranslate2d& contents _transform) {
891 DCHECK(CanHaveTilings()); 891 DCHECK(CanHaveTilings());
892 DCHECK_GE(contents_scale, MinimumContentsScale()); 892 DCHECK_GE(contents_transform.scale(), MinimumContentsScale());
893 DCHECK_LE(contents_scale, MaximumContentsScale()); 893 DCHECK_LE(contents_transform.scale(), MaximumContentsScale());
894 DCHECK(raster_source_->HasRecordings()); 894 DCHECK(raster_source_->HasRecordings());
895 return tilings_->AddTiling(ScaleTranslate2d(contents_scale, gfx::Vector2dF()), raster_source_); 895 return tilings_->AddTiling(contents_transform, raster_source_);
896 } 896 }
897 897
898 void PictureLayerImpl::RemoveAllTilings() { 898 void PictureLayerImpl::RemoveAllTilings() {
899 tilings_->RemoveAllTilings(); 899 tilings_->RemoveAllTilings();
900 // If there are no tilings, then raster scales are no longer meaningful. 900 // If there are no tilings, then raster scales are no longer meaningful.
901 ResetRasterScale(); 901 ResetRasterScale();
902 } 902 }
903 903
904 void PictureLayerImpl::AddTilingsForRasterScale() { 904 void PictureLayerImpl::AddTilingsForRasterScale() {
905 // Reset all resolution enums on tilings, we'll be setting new values in this 905 // Reset all resolution enums on tilings, we'll be setting new values in this
906 // function. 906 // function.
907 tilings_->MarkAllTilingsNonIdeal(); 907 tilings_->MarkAllTilingsNonIdeal();
908 908
909 PictureLayerTiling* high_res = 909 PictureLayerTiling* high_res =
910 tilings_->FindTilingWithScaleKey(raster_contents_scale_); 910 tilings_->FindTilingWithScaleKey(raster_contents_scale_);
911 gfx::Vector2dF raster_translation = CalculateRasterTranslation(raster_contents _scale_);
912 if (high_res && high_res->raster_transform().translation() != raster_translati on) {
enne (OOO) 2017/01/03 22:54:00 This logic about changing the raster translation b
913 tilings_->Remove(high_res);
914 high_res = nullptr;
915 }
911 if (!high_res) { 916 if (!high_res) {
912 // We always need a high res tiling, so create one if it doesn't exist. 917 // We always need a high res tiling, so create one if it doesn't exist.
913 high_res = AddTiling(raster_contents_scale_); 918 high_res = AddTiling(ScaleTranslate2d(raster_contents_scale_, raster_transla tion));
914 } else if (high_res->may_contain_low_resolution_tiles()) { 919 } else if (high_res->may_contain_low_resolution_tiles()) {
915 // If the tiling we find here was LOW_RESOLUTION previously, it may not be 920 // If the tiling we find here was LOW_RESOLUTION previously, it may not be
916 // fully rastered, so destroy the old tiles. 921 // fully rastered, so destroy the old tiles.
917 high_res->Reset(); 922 high_res->Reset();
918 // Reset the flag now that we'll make it high res, it will have fully 923 // Reset the flag now that we'll make it high res, it will have fully
919 // rastered content. 924 // rastered content.
920 high_res->reset_may_contain_low_resolution_tiles(); 925 high_res->reset_may_contain_low_resolution_tiles();
921 } 926 }
922 high_res->set_resolution(HIGH_RESOLUTION); 927 high_res->set_resolution(HIGH_RESOLUTION);
923 928
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 tilings_->FindTilingWithScaleKey(low_res_raster_contents_scale_); 1005 tilings_->FindTilingWithScaleKey(low_res_raster_contents_scale_);
1001 DCHECK(!low_res || low_res->resolution() != HIGH_RESOLUTION); 1006 DCHECK(!low_res || low_res->resolution() != HIGH_RESOLUTION);
1002 1007
1003 // Only create new low res tilings when the transform is static. This 1008 // Only create new low res tilings when the transform is static. This
1004 // prevents wastefully creating a paired low res tiling for every new high 1009 // prevents wastefully creating a paired low res tiling for every new high
1005 // res tiling during a pinch or a CSS animation. 1010 // res tiling during a pinch or a CSS animation.
1006 bool is_pinching = layer_tree_impl()->PinchGestureActive(); 1011 bool is_pinching = layer_tree_impl()->PinchGestureActive();
1007 bool is_animating = draw_properties().screen_space_transform_is_animating; 1012 bool is_animating = draw_properties().screen_space_transform_is_animating;
1008 if (!is_pinching && !is_animating) { 1013 if (!is_pinching && !is_animating) {
1009 if (!low_res) 1014 if (!low_res)
1010 low_res = AddTiling(low_res_raster_contents_scale_); 1015 low_res = AddTiling(ScaleTranslate2d(low_res_raster_contents_scale_, gfx:: Vector2dF()));
1011 low_res->set_resolution(LOW_RESOLUTION); 1016 low_res->set_resolution(LOW_RESOLUTION);
1012 } 1017 }
1013 } 1018 }
1014 1019
1015 void PictureLayerImpl::RecalculateRasterScales() { 1020 void PictureLayerImpl::RecalculateRasterScales() {
1016 if (is_directly_composited_image_) { 1021 if (is_directly_composited_image_) {
1017 if (!raster_source_scale_) 1022 if (!raster_source_scale_)
1018 raster_source_scale_ = 1.f; 1023 raster_source_scale_ = 1.f;
1019 1024
1020 float min_scale = MinimumContentsScale(); 1025 float min_scale = MinimumContentsScale();
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 } 1171 }
1167 1172
1168 PictureLayerTilingSet* twin_set = twin ? twin->tilings_.get() : nullptr; 1173 PictureLayerTilingSet* twin_set = twin ? twin->tilings_.get() : nullptr;
1169 tilings_->CleanUpTilings(min_acceptable_high_res_scale, 1174 tilings_->CleanUpTilings(min_acceptable_high_res_scale,
1170 max_acceptable_high_res_scale, used_tilings, 1175 max_acceptable_high_res_scale, used_tilings,
1171 twin_set); 1176 twin_set);
1172 DCHECK_GT(tilings_->num_tilings(), 0u); 1177 DCHECK_GT(tilings_->num_tilings(), 0u);
1173 SanityCheckTilingState(); 1178 SanityCheckTilingState();
1174 } 1179 }
1175 1180
1181 gfx::Vector2dF PictureLayerImpl::CalculateRasterTranslation(
1182 float raster_scale) {
1183 if (!use_transformed_rasterization_)
1184 return gfx::Vector2dF();
1185
1186 DCHECK(!draw_properties().screen_space_transform_is_animating);
1187 gfx::Transform draw_transform = DrawTransform();
1188 DCHECK(draw_transform.IsScaleOrTranslation());
1189
1190 // It is only useful to align the content space to the target space if their
1191 // relative pixel ratio is some small rational number. Currently we only
1192 // align if the relative pixel ratio is 1:1.
1193 // Good match if the maximum alignment error on a layer of size 10000px
1194 // does not exceed 0.001px.
1195 static constexpr float kErrorThreshold = 0.0000001f;
1196 if (std::abs(draw_transform.matrix().getFloat(0, 0) - raster_scale) >
1197 kErrorThreshold ||
1198 std::abs(draw_transform.matrix().getFloat(1, 1) - raster_scale) >
1199 kErrorThreshold)
1200 return gfx::Vector2dF();
1201
1202 // Extract the fractional part of layer origin in the target space.
1203 float origin_x = draw_transform.matrix().getFloat(0, 3);
1204 float origin_y = draw_transform.matrix().getFloat(1, 3);
1205 return gfx::Vector2dF(origin_x - floorf(origin_x),
1206 origin_y - floorf(origin_y));
1207 }
1208
1176 float PictureLayerImpl::MinimumContentsScale() const { 1209 float PictureLayerImpl::MinimumContentsScale() const {
1177 float setting_min = layer_tree_impl()->settings().minimum_contents_scale; 1210 float setting_min = layer_tree_impl()->settings().minimum_contents_scale;
1178 1211
1179 // If the contents scale is less than 1 / width (also for height), 1212 // If the contents scale is less than 1 / width (also for height),
1180 // then it will end up having less than one pixel of content in that 1213 // then it will end up having less than one pixel of content in that
1181 // dimension. Bump the minimum contents scale up in this case to prevent 1214 // dimension. Bump the minimum contents scale up in this case to prevent
1182 // this from happening. 1215 // this from happening.
1183 int min_dimension = std::min(raster_source_->GetSize().width(), 1216 int min_dimension = std::min(raster_source_->GetSize().width(),
1184 raster_source_->GetSize().height()); 1217 raster_source_->GetSize().height());
1185 if (!min_dimension) 1218 if (!min_dimension)
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 bool PictureLayerImpl::IsOnActiveOrPendingTree() const { 1389 bool PictureLayerImpl::IsOnActiveOrPendingTree() const {
1357 return !layer_tree_impl()->IsRecycleTree(); 1390 return !layer_tree_impl()->IsRecycleTree();
1358 } 1391 }
1359 1392
1360 bool PictureLayerImpl::HasValidTilePriorities() const { 1393 bool PictureLayerImpl::HasValidTilePriorities() const {
1361 return IsOnActiveOrPendingTree() && 1394 return IsOnActiveOrPendingTree() &&
1362 is_drawn_render_surface_layer_list_member(); 1395 is_drawn_render_surface_layer_list_member();
1363 } 1396 }
1364 1397
1365 } // namespace cc 1398 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/picture_layer_impl.h ('k') | cc/test/fake_picture_layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698