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