blob: f820378fda49d92b92135073321a68aa22dc22e1 [file] [log] [blame]
// Copyright 2017 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/raster/playback_image_provider.h"
#include "base/memory/ptr_util.h"
#include "cc/tiles/image_decode_cache.h"
namespace cc {
namespace {
SkIRect RoundOutRect(const SkRect& rect) {
SkIRect result;
rect.roundOut(&result);
return result;
}
void UnrefImageFromCache(DrawImage draw_image,
ImageDecodeCache* cache,
DecodedDrawImage decoded_draw_image) {
cache->DrawWithImageFinished(draw_image, decoded_draw_image);
}
} // namespace
PlaybackImageProvider::PlaybackImageProvider(
bool skip_all_images,
PaintImageIdFlatSet images_to_skip,
ImageDecodeCache* cache,
const gfx::ColorSpace& target_color_space)
: skip_all_images_(skip_all_images),
images_to_skip_(std::move(images_to_skip)),
cache_(cache),
target_color_space_(target_color_space) {
DCHECK(cache_);
}
PlaybackImageProvider::~PlaybackImageProvider() = default;
PlaybackImageProvider::PlaybackImageProvider(PlaybackImageProvider&& other) =
default;
PlaybackImageProvider& PlaybackImageProvider::operator=(
PlaybackImageProvider&& other) = default;
ImageProvider::ScopedDecodedDrawImage
PlaybackImageProvider::GetDecodedDrawImage(const PaintImage& paint_image,
const SkRect& src_rect,
SkFilterQuality filter_quality,
const SkMatrix& matrix) {
// Return an empty decoded images if we are skipping all images during this
// raster.
if (skip_all_images_)
return ScopedDecodedDrawImage();
if (images_to_skip_.count(paint_image.stable_id()) != 0) {
DCHECK(paint_image.GetSkImage()->isLazyGenerated());
return ScopedDecodedDrawImage();
}
if (!paint_image.GetSkImage()->isLazyGenerated()) {
return ScopedDecodedDrawImage(
DecodedDrawImage(paint_image.GetSkImage(), SkSize::Make(0, 0),
SkSize::Make(1.f, 1.f), filter_quality));
}
DrawImage draw_image = DrawImage(paint_image, RoundOutRect(src_rect),
filter_quality, matrix, target_color_space_);
return ScopedDecodedDrawImage(
cache_->GetDecodedImageForDraw(draw_image),
base::BindOnce(&UnrefImageFromCache, std::move(draw_image), cache_));
}
} // namespace cc