Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3159)

Unified Diff: cc/playback/discardable_image_map.cc

Issue 2514263002: Handle simple SkImageShaders (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | cc/playback/discardable_image_map_unittest.cc » ('j') | cc/playback/image_hijack_canvas.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
« no previous file with comments | « no previous file | cc/playback/discardable_image_map_unittest.cc » ('j') | cc/playback/image_hijack_canvas.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698