1// Copyright 2013 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#ifndef CHROME_BROWSER_THUMBNAILS_CONTENT_BASED_THUMBNAILING_ALGORITHM_H_
6#define CHROME_BROWSER_THUMBNAILS_CONTENT_BASED_THUMBNAILING_ALGORITHM_H_
7
8#include "chrome/browser/thumbnails/thumbnailing_algorithm.h"
9
10namespace thumbnails {
11
12// Encapsulates a method of creating a thumbnail from a captured tab shot which
13// attempts to preserve only relevant fragments of the original image.
14// The algorithm detects areas of high activity at low resolution and discards
15// rows and columns which do not intersect with these areas.
16class ContentBasedThumbnailingAlgorithm : public ThumbnailingAlgorithm {
17 public:
18  explicit ContentBasedThumbnailingAlgorithm(const gfx::Size& target_size);
19
20  virtual ClipResult GetCanvasCopyInfo(const gfx::Size& source_size,
21                                       ui::ScaleFactor scale_factor,
22                                       gfx::Rect* clipping_rect,
23                                       gfx::Size* target_size) const OVERRIDE;
24
25  virtual void ProcessBitmap(scoped_refptr<ThumbnailingContext> context,
26                             const ConsumerCallback& callback,
27                             const SkBitmap& bitmap) OVERRIDE;
28
29  // Prepares (clips to size, copies etc.) the bitmap passed to ProcessBitmap.
30  // Always returns a bitmap that can be properly refcounted.
31  // Extracted and exposed as a test seam.
32  static SkBitmap PrepareSourceBitmap(const SkBitmap& received_bitmap,
33                                      const gfx::Size& thumbnail_size,
34                                      ThumbnailingContext* context);
35
36  // The function processes |source_bitmap| into a thumbnail of |thumbnail_size|
37  // and passes the result into |callback| (on UI thread). |context| describes
38  // how the thumbnail is being created.
39  static void CreateRetargetedThumbnail(
40      const SkBitmap& source_bitmap,
41      const gfx::Size& thumbnail_size,
42      scoped_refptr<ThumbnailingContext> context,
43      const ConsumerCallback& callback);
44
45 protected:
46  virtual ~ContentBasedThumbnailingAlgorithm();
47
48 private:
49  static gfx::Rect GetClippingRect(const gfx::Size& source_size,
50                                   const gfx::Size& thumbnail_size,
51                                   gfx::Size* target_size,
52                                   ClipResult* clip_result);
53
54  const gfx::Size target_size_;
55
56  DISALLOW_COPY_AND_ASSIGN(ContentBasedThumbnailingAlgorithm);
57};
58
59}  // namespace thumbnails
60
61#endif  // CHROME_BROWSER_THUMBNAILS_CONTENT_BASED_THUMBNAILING_ALGORITHM_H_
62