12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/thumbnails/simple_thumbnail_crop.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/thumbnails/thumbnailing_context.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/render_messages.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_types.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_renderer_host.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/platform_canvas.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkColorPriv.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/surface/transport_dib.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using thumbnails::SimpleThumbnailCrop;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef testing::Test SimpleThumbnailCropTest;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, CalculateBoringScore_Empty) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_DOUBLE_EQ(1.0, SimpleThumbnailCrop::CalculateBoringScore(bitmap));
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, CalculateBoringScore_SingleColor) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size kSize(20, 10);
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(kSize, 1.0f, true);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill all pixels in black.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas.FillRect(gfx::Rect(kSize), SK_ColorBLACK);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap =
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The thumbnail should deserve the highest boring score.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_DOUBLE_EQ(1.0, SimpleThumbnailCrop::CalculateBoringScore(bitmap));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, CalculateBoringScore_TwoColors) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size kSize(20, 10);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(kSize, 1.0f, true);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill all pixels in black.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas.FillRect(gfx::Rect(kSize), SK_ColorBLACK);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fill the left half pixels in white.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  canvas.FillRect(gfx::Rect(0, 0, kSize.width() / 2, kSize.height()),
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  SK_ColorWHITE);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap =
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kSize.width(), bitmap.width());
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(kSize.height(), bitmap.height());
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The thumbnail should be less boring because two colors are used.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_DOUBLE_EQ(0.5, SimpleThumbnailCrop::CalculateBoringScore(bitmap));
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, GetClippedBitmap_TallerThanWide) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input bitmap is vertically long.
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(gfx::Size(40, 90), 1.0f, true);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap =
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The desired size is square.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  thumbnails::ClipResult clip_result = thumbnails::CLIP_RESULT_NOT_CLIPPED;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap clipped_bitmap = SimpleThumbnailCrop::GetClippedBitmap(
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bitmap, 10, 10, &clip_result);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The clipped bitmap should be square.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.width());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.height());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input was taller than wide.
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_TALLER_THAN_WIDE, clip_result);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, GetClippedBitmap_WiderThanTall) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input bitmap is horizontally long.
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(gfx::Size(70, 40), 1.0f, true);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap =
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The desired size is square.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  thumbnails::ClipResult clip_result = thumbnails::CLIP_RESULT_NOT_CLIPPED;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap clipped_bitmap = SimpleThumbnailCrop::GetClippedBitmap(
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bitmap, 10, 10, &clip_result);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The clipped bitmap should be square.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.width());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.height());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input was wider than tall.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_WIDER_THAN_TALL, clip_result);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, GetClippedBitmap_TooWiderThanTall) {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input bitmap is horizontally very long.
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(gfx::Size(90, 40), 1.0f, true);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap =
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The desired size is square.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  thumbnails::ClipResult clip_result = thumbnails::CLIP_RESULT_NOT_CLIPPED;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap clipped_bitmap = SimpleThumbnailCrop::GetClippedBitmap(
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bitmap, 10, 10, &clip_result);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The clipped bitmap should be square.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.width());
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.height());
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input was wider than tall.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_MUCH_WIDER_THAN_TALL, clip_result);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, GetClippedBitmap_NotClipped) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input bitmap is square.
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(gfx::Size(40, 40), 1.0f, true);
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap =
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The desired size is square.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  thumbnails::ClipResult clip_result = thumbnails::CLIP_RESULT_NOT_CLIPPED;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap clipped_bitmap = SimpleThumbnailCrop::GetClippedBitmap(
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bitmap, 10, 10, &clip_result);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The clipped bitmap should be square.
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.width());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.height());
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // There was no need to clip.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_NOT_CLIPPED, clip_result);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, GetClippedBitmap_NonSquareOutput) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input bitmap is square.
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Canvas canvas(gfx::Size(40, 40), 1.0f, true);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap bitmap =
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::GetTopDevice(*canvas.sk_canvas())->accessBitmap(false);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The desired size is horizontally long.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  thumbnails::ClipResult clip_result = thumbnails::CLIP_RESULT_NOT_CLIPPED;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkBitmap clipped_bitmap = SimpleThumbnailCrop::GetClippedBitmap(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bitmap, 20, 10, &clip_result);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The clipped bitmap should have the same aspect ratio of the desired size.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(40, clipped_bitmap.width());
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(20, clipped_bitmap.height());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The input was taller than wide.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_TALLER_THAN_WIDE, clip_result);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SimpleThumbnailCropTest, GetCanvasCopyInfo) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size thumbnail_size(200, 120);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float desired_aspect =
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<float>(thumbnail_size.width()) / thumbnail_size.height();
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<thumbnails::ThumbnailingAlgorithm> algorithm(
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new SimpleThumbnailCrop(thumbnail_size));
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect clipping_rect_result;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size target_size_result;
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  thumbnails::ClipResult clip_result = algorithm->GetCanvasCopyInfo(
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Size(400, 210),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SCALE_FACTOR_200P,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &clipping_rect_result,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &target_size_result);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Size clipping_size = clipping_rect_result.size();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float clip_aspect =
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<float>(clipping_size.width()) / clipping_size.height();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_WIDER_THAN_TALL, clip_result);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnail_size, target_size_result);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(desired_aspect, clip_aspect, 0.01);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clip_result = algorithm->GetCanvasCopyInfo(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Size(600, 200),
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SCALE_FACTOR_200P,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &clipping_rect_result,
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &target_size_result);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clipping_size = clipping_rect_result.size();
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clip_aspect =
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<float>(clipping_size.width()) / clipping_size.height();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_MUCH_WIDER_THAN_TALL, clip_result);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnail_size, target_size_result);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(desired_aspect, clip_aspect, 0.01);
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clip_result = algorithm->GetCanvasCopyInfo(
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Size(300, 600),
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SCALE_FACTOR_200P,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &clipping_rect_result,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &target_size_result);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clipping_size = clipping_rect_result.size();
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clip_aspect =
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<float>(clipping_size.width()) / clipping_size.height();
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_TALLER_THAN_WIDE, clip_result);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnail_size, target_size_result);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NEAR(desired_aspect, clip_aspect, 0.01);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  clip_result = algorithm->GetCanvasCopyInfo(
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Size(200, 100),
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::SCALE_FACTOR_200P,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &clipping_rect_result,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &target_size_result);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_SOURCE_IS_SMALLER, clip_result);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(thumbnail_size, target_size_result);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(SimpleThumbnailCropTest, GetClippingRect) {
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const gfx::Size desired_size(300, 200);
202868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  thumbnails::ClipResult clip_result;
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Try out 'microsource'.
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect clip_rect = SimpleThumbnailCrop::GetClippingRect(
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::Size(300, 199), desired_size, &clip_result);
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_SOURCE_IS_SMALLER, clip_result);
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 0).ToString(), clip_rect.origin().ToString());
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(desired_size.ToString(), clip_rect.size().ToString());
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Portrait source.
211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  clip_rect = SimpleThumbnailCrop::GetClippingRect(
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::Size(500, 1200), desired_size, &clip_result);
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_TALLER_THAN_WIDE, clip_result);
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 0).ToString(), clip_rect.origin().ToString());
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(500, clip_rect.width());
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_GE(1200, clip_rect.height());
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  clip_rect = SimpleThumbnailCrop::GetClippingRect(
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::Size(2000, 800), desired_size, &clip_result);
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(clip_result == thumbnails::CLIP_RESULT_WIDER_THAN_TALL ||
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              clip_result == thumbnails::CLIP_RESULT_MUCH_WIDER_THAN_TALL);
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0, clip_rect.y());
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_LT(0, clip_rect.x());
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_GE(2000, clip_rect.width());
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(800, clip_rect.height());
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  clip_rect = SimpleThumbnailCrop::GetClippingRect(
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      gfx::Size(900, 600), desired_size, &clip_result);
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(thumbnails::CLIP_RESULT_NOT_CLIPPED, clip_result);
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(gfx::Point(0, 0).ToString(), clip_rect.origin().ToString());
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(gfx::Size(900, 600).ToString(), clip_rect.size().ToString());
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
233