| // Copyright (c) 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_SIMPLE_THUMBNAIL_CROP_H_ |
| #define CHROME_BROWSER_THUMBNAILS_SIMPLE_THUMBNAIL_CROP_H_ |
| |
| #include "chrome/browser/thumbnails/thumbnailing_algorithm.h" |
| |
| namespace thumbnails { |
| |
| // The implementation of the 'classic' thumbnail cropping algorithm. It is not |
| // content-driven in any meaningful way (save for score calculation). Rather, |
| // the choice of a cropping region is based on relation between source and |
| // target sizes. The selected source region is then rescaled into the target |
| // thumbnail image. |
| class SimpleThumbnailCrop : public ThumbnailingAlgorithm { |
| public: |
| explicit SimpleThumbnailCrop(const gfx::Size& target_size); |
| |
| virtual ClipResult GetCanvasCopyInfo(const gfx::Size& source_size, |
| ui::ScaleFactor scale_factor, |
| gfx::Rect* clipping_rect, |
| gfx::Size* target_size) const OVERRIDE; |
| |
| virtual void ProcessBitmap(scoped_refptr<ThumbnailingContext> context, |
| const ConsumerCallback& callback, |
| const SkBitmap& bitmap) OVERRIDE; |
| |
| // Calculates how "boring" a thumbnail is. The boring score is the |
| // 0,1 ranged percentage of pixels that are the most common |
| // luma. Higher boring scores indicate that a higher percentage of a |
| // bitmap are all the same brightness. |
| // Statically exposed for use by tests only. |
| static double CalculateBoringScore(const SkBitmap& bitmap); |
| |
| // Gets the clipped bitmap from |bitmap| per the aspect ratio of the |
| // desired width and the desired height. For instance, if the input |
| // bitmap is vertically long (ex. 400x900) and the desired size is |
| // square (ex. 100x100), the clipped bitmap will be the top half of the |
| // input bitmap (400x400). |
| // Statically exposed for use by tests only. |
| static SkBitmap GetClippedBitmap(const SkBitmap& bitmap, |
| int desired_width, |
| int desired_height, |
| thumbnails::ClipResult* clip_result); |
| static gfx::Size GetCopySizeForThumbnail(ui::ScaleFactor scale_factor, |
| const gfx::Size& thumbnail_size); |
| static gfx::Rect GetClippingRect(const gfx::Size& source_size, |
| const gfx::Size& desired_size, |
| ClipResult* clip_result); |
| |
| // Computes the size of a thumbnail that should be stored in the database from |
| // |given_size| (expected to be the thumbnail size we would normally want to |
| // see). The returned size is expressed in pixels and is determined by |
| // bumping the resolution up to the maximum scale factor. |
| static gfx::Size ComputeTargetSizeAtMaximumScale(const gfx::Size& given_size); |
| |
| protected: |
| virtual ~SimpleThumbnailCrop(); |
| |
| private: |
| static SkBitmap CreateThumbnail(const SkBitmap& bitmap, |
| const gfx::Size& desired_size, |
| ClipResult* clip_result); |
| |
| const gfx::Size target_size_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SimpleThumbnailCrop); |
| }; |
| |
| } |
| |
| #endif // CHROME_BROWSER_THUMBNAILS_SIMPLE_THUMBNAIL_CROP_H_ |