| 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_;
|
|
|