Index: cc/layers/picture_layer_impl.cc |
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc |
index 8be30987e03be429d9c3e9919c4dc18c85dc6889..2e0d06158d0f589c6e389791cdaaa5ac702074ba 100644 |
--- a/cc/layers/picture_layer_impl.cc |
+++ b/cc/layers/picture_layer_impl.cc |
@@ -49,6 +49,40 @@ const int kMinHeightForGpuRasteredTile = 256; |
// of using the same tile size. |
const int kTileRoundUp = 64; |
+// The precision value for rounding floating points values (of scale factors), |
+// to given decimal places so that scale factors which are almost equal (differ |
+// by some threshold magnitude of floating point epsilon) are considered as |
+// same. |
+const int kScalePrecision = 4; |
+ |
+bool VerifyFixedPrecisionValue(float value) { |
+ const base::CheckedNumeric<float> checked_factor = pow(10, kScalePrecision); |
+ if (!checked_factor.IsValid()) |
+ return false; |
+ |
+ base::CheckedNumeric<float> checked_value = value; |
+ checked_value *= checked_factor.ValueOrDie(); |
+ if (!checked_value.IsValid()) |
+ return false; |
+ |
+ checked_value = floor(checked_value.ValueOrDie()); |
+ checked_value /= checked_factor.ValueOrDie(); |
+ return checked_value.IsValid(); |
+} |
+ |
+float GetFixedPrecisionValue(float value) { |
+ // Limiting precision 1 <= kScalePrecision <= 8, as floating point precision |
+ // of >= 12 gives different values, 8 on a safer side. |
+ DCHECK(kScalePrecision >= 1 && kScalePrecision <= 8); |
+ DCHECK(VerifyFixedPrecisionValue(value)); |
+ |
+ const float factor = pow(10, kScalePrecision); |
enne (OOO)
2015/08/27 18:08:34
It is weird to do math with base 10. Surely there
|
+ value *= factor; |
+ value = floor(value); |
+ value /= factor; |
+ return value; |
+} |
+ |
} // namespace |
namespace cc { |
@@ -902,10 +936,12 @@ void PictureLayerImpl::RecalculateRasterScales() { |
float old_raster_page_scale = raster_page_scale_; |
float old_raster_source_scale = raster_source_scale_; |
- raster_device_scale_ = ideal_device_scale_; |
- raster_page_scale_ = ideal_page_scale_; |
- raster_source_scale_ = ideal_source_scale_; |
- raster_contents_scale_ = ideal_contents_scale_; |
+ // Get fixed precision values to avoid creating extra tilings for scales |
+ // which are almost equal. |
+ raster_device_scale_ = GetFixedPrecisionValue(ideal_device_scale_); |
+ raster_page_scale_ = GetFixedPrecisionValue(ideal_page_scale_); |
+ raster_source_scale_ = GetFixedPrecisionValue(ideal_source_scale_); |
+ raster_contents_scale_ = GetFixedPrecisionValue(ideal_contents_scale_); |
enne (OOO)
2015/08/27 18:08:34
Do we really need fixed precision for all of these
|
// If we're not animating, or leaving an animation, and the |
// ideal_source_scale_ changes, then things are unpredictable, and we fix |