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

Unified Diff: cc/playback/discardable_image_map.cc

Issue 2514263002: Handle simple SkImageShaders (Closed)
Patch Set: fix unit test Created 4 years 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') | no next file with comments »
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 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_;
« no previous file with comments | « no previous file | cc/playback/discardable_image_map_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698