Index: cc/playback/discardable_image_map.cc |
diff --git a/cc/playback/discardable_image_map.cc b/cc/playback/discardable_image_map.cc |
index 133347544febde0358e421249e3a8bdc9757efd8..b1facd5bade0e5dd8d3539fbb9de156cb723de8e 100644 |
--- a/cc/playback/discardable_image_map.cc |
+++ b/cc/playback/discardable_image_map.cc |
@@ -15,23 +15,25 @@ |
namespace cc { |
-namespace { |
- |
SkRect MapRect(const SkMatrix& matrix, const SkRect& src) { |
SkRect dst; |
matrix.mapRect(&dst, src); |
return dst; |
} |
-SkSize ExtractScale(const SkMatrix& matrix) { |
- SkSize scale = SkSize::Make(matrix.getScaleX(), matrix.getScaleY()); |
+bool ExtractScale(const SkMatrix& matrix, SkSize* scale) { |
+ *scale = SkSize::Make(matrix.getScaleX(), matrix.getScaleY()); |
if (matrix.getType() & SkMatrix::kAffine_Mask) { |
- if (!matrix.decomposeScale(&scale)) |
- scale.set(1, 1); |
+ if (!matrix.decomposeScale(scale)) { |
+ scale->set(1, 1); |
+ return false; |
+ } |
} |
- return scale; |
+ return true; |
} |
+namespace { |
+ |
// We're using an NWay canvas with no added canvases, so in effect |
// non-overridden functions are no-ops. |
class DiscardableImagesMetadataCanvas : public SkNWayCanvas { |
@@ -92,15 +94,33 @@ class DiscardableImagesMetadataCanvas : public SkNWayCanvas { |
const SkRect& rect, |
const SkMatrix& matrix, |
const SkPaint* paint) { |
- if (rect.intersects(canvas_bounds_) && image->isLazyGenerated()) { |
- SkFilterQuality filter_quality = kNone_SkFilterQuality; |
- if (paint) { |
- filter_quality = paint->getFilterQuality(); |
+ if (!image->isLazyGenerated()) |
+ return; |
+ |
+ SkRect paint_rect = rect; |
+ if (paint) { |
+ if (paint->canComputeFastBounds()) { |
+ paint_rect = paint->computeFastBounds(rect, &paint_rect); |
+ } else { |
+ // TODO(vmpstr): UMA this case. |
+ paint_rect = canvas_bounds_; |
} |
- image_set_->push_back( |
- std::make_pair(DrawImage(image, ExtractScale(matrix), filter_quality), |
- gfx::SkRectToRectF(rect))); |
} |
+ |
+ if (!rect.intersects(canvas_bounds_)) |
+ return; |
+ |
+ SkFilterQuality filter_quality = kNone_SkFilterQuality; |
+ if (paint) { |
+ filter_quality = paint->getFilterQuality(); |
+ } |
+ |
+ SkSize scale; |
+ bool is_decomposable = ExtractScale(matrix, &scale); |
+ image_set_->push_back( |
+ std::make_pair(DrawImage(image, scale, filter_quality, |
+ matrix.hasPerspective(), is_decomposable), |
+ gfx::SkRectToRectF(rect))); |
} |
std::vector<std::pair<DrawImage, gfx::RectF>>* image_set_; |