blob: 517a6c4ec3c1f160dfde3bf1fd240b4db641e166 [file] [log] [blame]
// Copyright 2013 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.
#ifndef CHROME_BROWSER_THUMBNAILS_CONTENT_BASED_THUMBNAILING_ALGORITHM_H_
#define CHROME_BROWSER_THUMBNAILS_CONTENT_BASED_THUMBNAILING_ALGORITHM_H_
#include "chrome/browser/thumbnails/thumbnailing_algorithm.h"
namespace thumbnails {
// Encapsulates a method of creating a thumbnail from a captured tab shot which
// attempts to preserve only relevant fragments of the original image.
// The algorithm detects areas of high activity at low resolution and discards
// rows and columns which do not intersect with these areas.
class ContentBasedThumbnailingAlgorithm : public ThumbnailingAlgorithm {
public:
explicit ContentBasedThumbnailingAlgorithm(const gfx::Size& target_size);
ClipResult GetCanvasCopyInfo(const gfx::Size& source_size,
ui::ScaleFactor scale_factor,
gfx::Rect* clipping_rect,
gfx::Size* target_size) const override;
void ProcessBitmap(scoped_refptr<ThumbnailingContext> context,
const ConsumerCallback& callback,
const SkBitmap& bitmap) override;
// Prepares (clips to size, copies etc.) the bitmap passed to ProcessBitmap.
// Always returns a bitmap that can be properly refcounted.
// Extracted and exposed as a test seam.
static SkBitmap PrepareSourceBitmap(const SkBitmap& received_bitmap,
const gfx::Size& thumbnail_size,
ThumbnailingContext* context);
// The function processes |source_bitmap| into a thumbnail of |thumbnail_size|
// and passes the result into |callback| (on UI thread). |context| describes
// how the thumbnail is being created.
static void CreateRetargetedThumbnail(
const SkBitmap& source_bitmap,
const gfx::Size& thumbnail_size,
scoped_refptr<ThumbnailingContext> context,
const ConsumerCallback& callback);
protected:
~ContentBasedThumbnailingAlgorithm() override;
private:
static gfx::Rect GetClippingRect(const gfx::Size& source_size,
const gfx::Size& thumbnail_size,
gfx::Size* target_size,
ClipResult* clip_result);
const gfx::Size target_size_;
DISALLOW_COPY_AND_ASSIGN(ContentBasedThumbnailingAlgorithm);
};
} // namespace thumbnails
#endif // CHROME_BROWSER_THUMBNAILS_CONTENT_BASED_THUMBNAILING_ALGORITHM_H_