Chromium Code Reviews| Index: cc/playback/discardable_image_map.cc |
| diff --git a/cc/playback/discardable_image_map.cc b/cc/playback/discardable_image_map.cc |
| index e4ae644e227528982399d5d61232ff5c21062904..7b6fed59aa991d8b510fce85638b1042b77e290f 100644 |
| --- a/cc/playback/discardable_image_map.cc |
| +++ b/cc/playback/discardable_image_map.cc |
| @@ -13,6 +13,7 @@ |
| #include "base/memory/ptr_util.h" |
| #include "cc/base/math_util.h" |
| #include "cc/playback/display_item_list.h" |
| +#include "third_party/skia/include/core/SkPath.h" |
| #include "third_party/skia/include/utils/SkNWayCanvas.h" |
| #include "ui/gfx/geometry/rect_conversions.h" |
| #include "ui/gfx/skia_util.h" |
| @@ -100,7 +101,7 @@ class DiscardableImagesMetadataCanvas : public SkNWayCanvas { |
| } |
| SkMatrix matrix; |
| matrix.setRectToRect(*src, dst, SkMatrix::kFill_ScaleToFit); |
| - matrix.postConcat(ctm); |
| + matrix.preConcat(ctm); |
| AddImage(sk_ref_sp(image), *src, MapRect(ctm, dst), matrix, paint); |
| } |
| @@ -112,6 +113,30 @@ class DiscardableImagesMetadataCanvas : public SkNWayCanvas { |
| NOTREACHED(); |
| } |
| + void onDrawRect(const SkRect& r, const SkPaint& paint) override { |
| + AddPaintImage(r, paint); |
| + } |
| + |
| + void onDrawPath(const SkPath& path, const SkPaint& paint) override { |
| + AddPaintImage(path.getBounds(), paint); |
| + } |
| + |
| + void onDrawOval(const SkRect& r, const SkPaint& paint) override { |
| + AddPaintImage(r, paint); |
| + } |
| + |
| + void onDrawArc(const SkRect& r, |
| + SkScalar start_angle, |
| + SkScalar sweep_angle, |
| + bool use_center, |
| + const SkPaint& paint) override { |
| + AddPaintImage(r, paint); |
| + } |
| + |
| + void onDrawRRect(const SkRRect& rr, const SkPaint& paint) override { |
| + AddPaintImage(rr.rect(), paint); |
| + } |
| + |
| SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec& rec) override { |
| saved_paints_.push_back(*rec.fPaint); |
| return SkNWayCanvas::getSaveLayerStrategy(rec); |
| @@ -178,6 +203,26 @@ class DiscardableImagesMetadataCanvas : public SkNWayCanvas { |
| SafeClampPaintRectToSize(paint_rect, canvas_size_))); |
| } |
| + // Currently this function only handles extracting images from SkImageShaders |
| + // embedded in SkPaints. Other embedded image cases, such as SkPictures, |
| + // are not yet handled. |
| + void AddPaintImage(const SkRect& rect, const SkPaint& paint) { |
| + SkShader* shader = paint.getShader(); |
| + if (shader) { |
| + SkMatrix matrix; |
| + SkShader::TileMode xy[2]; |
| + SkImage* image = shader->isAImage(&matrix, xy); |
| + if (image) { |
| + const SkMatrix& ctm = getTotalMatrix(); |
| + matrix.postConcat(ctm); |
| + // TODO(ericrk): Handle cases where we only need a sub-rect from the |
|
vmpstr
2016/12/06 22:43:36
Do you wanna file a bug for this and reference it
ericrk
2016/12/06 23:08:51
Will add in a follow-up CL.
|
| + // image. |
| + AddImage(sk_ref_sp(image), SkRect::MakeFromIRect(image->bounds()), |
| + MapRect(ctm, rect), matrix, &paint); |
| + } |
| + } |
| + } |
| + |
| std::vector<std::pair<DrawImage, gfx::Rect>>* image_set_; |
| const SkRect canvas_bounds_; |
| const gfx::Size canvas_size_; |