Index: cc/playback/image_hijack_canvas.cc |
diff --git a/cc/playback/image_hijack_canvas.cc b/cc/playback/image_hijack_canvas.cc |
deleted file mode 100644 |
index 7fe112e9ae1954895ab978393de00431e6b1bdf6..0000000000000000000000000000000000000000 |
--- a/cc/playback/image_hijack_canvas.cc |
+++ /dev/null |
@@ -1,336 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "cc/playback/image_hijack_canvas.h" |
- |
-#include "base/optional.h" |
-#include "base/trace_event/trace_event.h" |
-#include "cc/playback/discardable_image_map.h" |
-#include "cc/tiles/image_decode_cache.h" |
-#include "third_party/skia/include/core/SkPath.h" |
- |
-namespace cc { |
-namespace { |
- |
-SkIRect RoundOutRect(const SkRect& rect) { |
- SkIRect result; |
- rect.roundOut(&result); |
- return result; |
-} |
- |
-class ScopedDecodedImageLock { |
- public: |
- ScopedDecodedImageLock(ImageDecodeCache* image_decode_cache, |
- sk_sp<const SkImage> image, |
- const SkRect& src_rect, |
- const SkMatrix& matrix, |
- const SkPaint* paint) |
- : image_decode_cache_(image_decode_cache), |
- draw_image_(std::move(image), |
- RoundOutRect(src_rect), |
- paint ? paint->getFilterQuality() : kNone_SkFilterQuality, |
- matrix), |
- decoded_draw_image_( |
- image_decode_cache_->GetDecodedImageForDraw(draw_image_)) { |
- DCHECK(draw_image_.image()->isLazyGenerated()); |
- if (paint) { |
- decoded_paint_ = *paint; |
- decoded_paint_->setFilterQuality(decoded_draw_image_.filter_quality()); |
- } |
- } |
- |
- ScopedDecodedImageLock(ScopedDecodedImageLock&& from) |
- : image_decode_cache_(from.image_decode_cache_), |
- draw_image_(std::move(from.draw_image_)), |
- decoded_draw_image_(std::move(from.decoded_draw_image_)), |
- decoded_paint_(std::move(from.decoded_paint_)) { |
- from.image_decode_cache_ = nullptr; |
- } |
- |
- ~ScopedDecodedImageLock() { |
- if (image_decode_cache_) |
- image_decode_cache_->DrawWithImageFinished(draw_image_, |
- decoded_draw_image_); |
- } |
- |
- const DecodedDrawImage& decoded_image() const { return decoded_draw_image_; } |
- const SkPaint* decoded_paint() const { |
- return decoded_paint_ ? &decoded_paint_.value() : nullptr; |
- } |
- |
- private: |
- ImageDecodeCache* image_decode_cache_; |
- DrawImage draw_image_; |
- DecodedDrawImage decoded_draw_image_; |
- base::Optional<SkPaint> decoded_paint_; |
-}; |
- |
-// Encapsulates a ScopedDecodedImageLock and an SkPaint. Use of this class |
-// ensures that the ScopedDecodedImageLock outlives the dependent SkPaint. |
-class ScopedImagePaint { |
- public: |
- // Tries to create a ScopedImagePaint for the provided SkPaint. If a |
- // the SkPaint does not contain an image that we support replacing, |
- // an empty base::Optional will be returned. |
- static base::Optional<ScopedImagePaint> TryCreate( |
- ImageDecodeCache* image_decode_cache, |
- const SkMatrix& ctm, |
- const SkPaint& paint) { |
- SkShader* shader = paint.getShader(); |
- if (!shader) |
- return base::Optional<ScopedImagePaint>(); |
- |
- SkMatrix matrix; |
- SkShader::TileMode xy[2]; |
- SkImage* image = shader->isAImage(&matrix, xy); |
- if (!image || !image->isLazyGenerated()) |
- return base::Optional<ScopedImagePaint>(); |
- |
- SkMatrix total_image_matrix = matrix; |
- total_image_matrix.preConcat(ctm); |
- |
- ScopedDecodedImageLock scoped_lock( |
- image_decode_cache, sk_ref_sp(image), |
- SkRect::MakeIWH(image->width(), image->height()), total_image_matrix, |
- &paint); |
- const DecodedDrawImage& decoded_image = scoped_lock.decoded_image(); |
- if (!decoded_image.image()) |
- return base::Optional<ScopedImagePaint>(); |
- |
- bool need_scale = !decoded_image.is_scale_adjustment_identity(); |
- if (need_scale) { |
- matrix.preScale(1.f / decoded_image.scale_adjustment().width(), |
- 1.f / decoded_image.scale_adjustment().height()); |
- } |
- SkPaint scratch_paint = paint; |
- scratch_paint.setShader( |
- decoded_image.image()->makeShader(xy[0], xy[1], &matrix)); |
- scratch_paint.setFilterQuality(decoded_image.filter_quality()); |
- return ScopedImagePaint(std::move(scoped_lock), std::move(scratch_paint)); |
- } |
- |
- const SkPaint& paint() { return paint_; } |
- |
- private: |
- ScopedImagePaint(ScopedDecodedImageLock lock, SkPaint paint) |
- : lock_(std::move(lock)), paint_(std::move(paint)) {} |
- |
- ScopedDecodedImageLock lock_; |
- SkPaint paint_; |
-}; |
- |
-const SkImage* GetImageInPaint(const SkPaint& paint) { |
- SkShader* shader = paint.getShader(); |
- return shader ? shader->isAImage(nullptr, nullptr) : nullptr; |
-} |
- |
-} // namespace |
- |
-ImageHijackCanvas::ImageHijackCanvas(int width, |
- int height, |
- ImageDecodeCache* image_decode_cache, |
- const ImageIdFlatSet* images_to_skip) |
- : SkNWayCanvas(width, height), |
- image_decode_cache_(image_decode_cache), |
- images_to_skip_(images_to_skip) {} |
- |
-void ImageHijackCanvas::onDrawPicture(const SkPicture* picture, |
- const SkMatrix* matrix, |
- const SkPaint* paint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawPicture"); |
- // Ensure that pictures are unpacked by this canvas, instead of being |
- // forwarded to the raster canvas. |
- SkCanvas::onDrawPicture(picture, matrix, paint); |
-} |
- |
-void ImageHijackCanvas::onDrawImage(const SkImage* image, |
- SkScalar x, |
- SkScalar y, |
- const SkPaint* paint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawImage"); |
- if (!image->isLazyGenerated()) { |
- DCHECK(!ShouldSkipImage(image)); |
- SkNWayCanvas::onDrawImage(image, x, y, paint); |
- return; |
- } |
- |
- if (ShouldSkipImage(image)) |
- return; |
- |
- SkMatrix ctm = getTotalMatrix(); |
- |
- ScopedDecodedImageLock scoped_lock( |
- image_decode_cache_, sk_ref_sp(image), |
- SkRect::MakeIWH(image->width(), image->height()), ctm, paint); |
- const DecodedDrawImage& decoded_image = scoped_lock.decoded_image(); |
- if (!decoded_image.image()) |
- return; |
- |
- DCHECK_EQ(0, static_cast<int>(decoded_image.src_rect_offset().width())); |
- DCHECK_EQ(0, static_cast<int>(decoded_image.src_rect_offset().height())); |
- const SkPaint* decoded_paint = scoped_lock.decoded_paint(); |
- |
- bool need_scale = !decoded_image.is_scale_adjustment_identity(); |
- if (need_scale) { |
- SkNWayCanvas::save(); |
- SkNWayCanvas::scale(1.f / (decoded_image.scale_adjustment().width()), |
- 1.f / (decoded_image.scale_adjustment().height())); |
- } |
- SkNWayCanvas::onDrawImage(decoded_image.image().get(), x, y, decoded_paint); |
- if (need_scale) |
- SkNWayCanvas::restore(); |
-} |
- |
-void ImageHijackCanvas::onDrawImageRect(const SkImage* image, |
- const SkRect* src, |
- const SkRect& dst, |
- const SkPaint* paint, |
- SrcRectConstraint constraint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawImageRect"); |
- if (!image->isLazyGenerated()) { |
- DCHECK(!ShouldSkipImage(image)); |
- SkNWayCanvas::onDrawImageRect(image, src, dst, paint, constraint); |
- return; |
- } |
- |
- if (ShouldSkipImage(image)) |
- return; |
- |
- SkRect src_storage; |
- if (!src) { |
- src_storage = SkRect::MakeIWH(image->width(), image->height()); |
- src = &src_storage; |
- } |
- SkMatrix matrix; |
- matrix.setRectToRect(*src, dst, SkMatrix::kFill_ScaleToFit); |
- matrix.postConcat(getTotalMatrix()); |
- |
- ScopedDecodedImageLock scoped_lock(image_decode_cache_, sk_ref_sp(image), |
- *src, matrix, paint); |
- const DecodedDrawImage& decoded_image = scoped_lock.decoded_image(); |
- if (!decoded_image.image()) |
- return; |
- |
- const SkPaint* decoded_paint = scoped_lock.decoded_paint(); |
- |
- SkRect adjusted_src = |
- src->makeOffset(decoded_image.src_rect_offset().width(), |
- decoded_image.src_rect_offset().height()); |
- if (!decoded_image.is_scale_adjustment_identity()) { |
- float x_scale = decoded_image.scale_adjustment().width(); |
- float y_scale = decoded_image.scale_adjustment().height(); |
- adjusted_src = SkRect::MakeXYWH( |
- adjusted_src.x() * x_scale, adjusted_src.y() * y_scale, |
- adjusted_src.width() * x_scale, adjusted_src.height() * y_scale); |
- } |
- SkNWayCanvas::onDrawImageRect(decoded_image.image().get(), &adjusted_src, dst, |
- decoded_paint, constraint); |
-} |
- |
-void ImageHijackCanvas::onDrawRect(const SkRect& r, const SkPaint& paint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawRect"); |
- if (ShouldSkipImageInPaint(paint)) |
- return; |
- |
- base::Optional<ScopedImagePaint> image_paint = |
- ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
- if (!image_paint.has_value()) { |
- SkNWayCanvas::onDrawRect(r, paint); |
- return; |
- } |
- SkNWayCanvas::onDrawRect(r, image_paint.value().paint()); |
-} |
- |
-void ImageHijackCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawPath"); |
- if (ShouldSkipImageInPaint(paint)) |
- return; |
- |
- base::Optional<ScopedImagePaint> image_paint = |
- ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
- if (!image_paint.has_value()) { |
- SkNWayCanvas::onDrawPath(path, paint); |
- return; |
- } |
- SkNWayCanvas::onDrawPath(path, image_paint.value().paint()); |
-} |
- |
-void ImageHijackCanvas::onDrawOval(const SkRect& r, const SkPaint& paint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawOval"); |
- if (ShouldSkipImageInPaint(paint)) |
- return; |
- |
- base::Optional<ScopedImagePaint> image_paint = |
- ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
- if (!image_paint.has_value()) { |
- SkNWayCanvas::onDrawOval(r, paint); |
- return; |
- } |
- SkNWayCanvas::onDrawOval(r, image_paint.value().paint()); |
-} |
- |
-void ImageHijackCanvas::onDrawArc(const SkRect& r, |
- SkScalar start_angle, |
- SkScalar sweep_angle, |
- bool use_center, |
- const SkPaint& paint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawArc"); |
- if (ShouldSkipImageInPaint(paint)) |
- return; |
- |
- base::Optional<ScopedImagePaint> image_paint = |
- ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
- if (!image_paint.has_value()) { |
- SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, paint); |
- return; |
- } |
- SkNWayCanvas::onDrawArc(r, start_angle, sweep_angle, use_center, |
- image_paint.value().paint()); |
-} |
- |
-void ImageHijackCanvas::onDrawRRect(const SkRRect& rr, const SkPaint& paint) { |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::onDrawRRect"); |
- if (ShouldSkipImageInPaint(paint)) |
- return; |
- |
- base::Optional<ScopedImagePaint> image_paint = |
- ScopedImagePaint::TryCreate(image_decode_cache_, getTotalMatrix(), paint); |
- if (!image_paint.has_value()) { |
- SkNWayCanvas::onDrawRRect(rr, paint); |
- return; |
- } |
- SkNWayCanvas::onDrawRRect(rr, image_paint.value().paint()); |
-} |
- |
-void ImageHijackCanvas::onDrawImageNine(const SkImage* image, |
- const SkIRect& center, |
- const SkRect& dst, |
- const SkPaint* paint) { |
- // No cc embedder issues image nine calls. |
- NOTREACHED(); |
-} |
- |
-bool ImageHijackCanvas::ShouldSkipImage(const SkImage* image) const { |
- bool skip = |
- images_to_skip_->find(image->uniqueID()) != images_to_skip_->end(); |
- TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
- "ImageHijackCanvas::ShouldSkipImage", "imageId", |
- image->uniqueID(), "skip", skip); |
- return skip; |
-} |
- |
-bool ImageHijackCanvas::ShouldSkipImageInPaint(const SkPaint& paint) const { |
- const SkImage* image = GetImageInPaint(paint); |
- return image ? ShouldSkipImage(image) : false; |
-} |
- |
-} // namespace cc |