Upload upstream chromium 69.0.3497
[platform/framework/web/chromium-efl.git] / cc / tiles / decoded_image_tracker.cc
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "cc/tiles/decoded_image_tracker.h"
6 #include "base/trace_event/trace_event.h"
7
8 namespace cc {
9 namespace {
10 const int kNumFramesToLock = 2;
11 }  // namespace
12
13 DecodedImageTracker::DecodedImageTracker(ImageController* controller)
14     : image_controller_(controller) {
15   DCHECK(image_controller_);
16 }
17
18 DecodedImageTracker::~DecodedImageTracker() {
19   for (auto& pair : locked_images_)
20     image_controller_->UnlockImageDecode(pair.first);
21 }
22
23 void DecodedImageTracker::QueueImageDecode(
24     const PaintImage& image,
25     const gfx::ColorSpace& target_color_space,
26     const base::Callback<void(bool)>& callback) {
27   TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
28                "DecodedImageTracker::QueueImageDecode", "frame_key",
29                image.GetKeyForFrame(image.frame_index()).ToString());
30   DCHECK(image_controller_);
31   // Queue the decode in the image controller, but switch out the callback for
32   // our own.
33   auto image_bounds = SkIRect::MakeWH(image.width(), image.height());
34   DrawImage draw_image(image, image_bounds, kNone_SkFilterQuality,
35                        SkMatrix::I(), image.frame_index(), target_color_space);
36   image_controller_->QueueImageDecode(
37       draw_image, base::Bind(&DecodedImageTracker::ImageDecodeFinished,
38                              base::Unretained(this), callback));
39 }
40
41 void DecodedImageTracker::NotifyFrameFinished() {
42   // Go through the images and if the frame ref count goes to 0, unlock the
43   // image in the controller.
44   for (auto it = locked_images_.begin(); it != locked_images_.end();) {
45     auto id = it->first;
46     int& ref_count = it->second;
47     if (--ref_count != 0) {
48       ++it;
49       continue;
50     }
51     image_controller_->UnlockImageDecode(id);
52     it = locked_images_.erase(it);
53   }
54 }
55
56 void DecodedImageTracker::ImageDecodeFinished(
57     const base::Callback<void(bool)>& callback,
58     ImageController::ImageDecodeRequestId id,
59     ImageController::ImageDecodeResult result) {
60   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
61                "DecodedImageTracker::ImageDecodeFinished");
62
63   if (result == ImageController::ImageDecodeResult::SUCCESS)
64     locked_images_.push_back(std::make_pair(id, kNumFramesToLock));
65   bool decode_succeeded =
66       result == ImageController::ImageDecodeResult::SUCCESS ||
67       result == ImageController::ImageDecodeResult::DECODE_NOT_REQUIRED;
68   callback.Run(decode_succeeded);
69 }
70
71 }  // namespace cc