| Index: cc/playback/discardable_image_map.cc
|
| diff --git a/cc/playback/discardable_image_map.cc b/cc/playback/discardable_image_map.cc
|
| index 74f830df3470eb8c84e1f8cd846f2d859c4ece77..7055fdbea352207735515524cd45438abdfb2115 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"
|
| @@ -114,6 +115,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);
|
| @@ -185,6 +210,26 @@ class DiscardableImagesMetadataCanvas : public SkNWayCanvas {
|
| image_rect));
|
| }
|
|
|
| + // 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
|
| + // image.
|
| + AddImage(sk_ref_sp(image), SkRect::MakeFromIRect(image->bounds()),
|
| + MapRect(ctm, rect), matrix, &paint);
|
| + }
|
| + }
|
| + }
|
| +
|
| std::vector<std::pair<DrawImage, gfx::Rect>>* image_set_;
|
| DiscardableImageMap::ImageToRegionMap* image_id_to_region_;
|
| const SkRect canvas_bounds_;
|
|
|