15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/canvas.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <limits>
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/geometry/rect.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/geometry/rect_f.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/skia_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CanvasTest : public testing::Test {
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int GetStringWidth(const char *text) {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return Canvas::GetStringWidth(base::UTF8ToUTF16(text), font_list_);
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size SizeStringInt(const char *text, int width, int line_height) {
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 text16 = base::UTF8ToUTF16(text);
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int height = 0;
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int flags =
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        (text16.find('\n') != base::string16::npos) ? Canvas::MULTI_LINE : 0;
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Canvas::SizeStringInt(text16, font_list_, &width, &height, line_height,
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          flags);
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return gfx::Size(width, height);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FontList font_list_;
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CanvasTest, StringWidth) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_GT(GetStringWidth("Test"), 0);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CanvasTest, StringWidthEmptyString) {
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, GetStringWidth(""));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CanvasTest, StringSizeEmptyString) {
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size size = SizeStringInt("", 0, 0);
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, size.width());
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_GT(size.height(), 0);
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies GetClipBounds() returns the correct value.
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(CanvasTest, ClipRectWithScaling) {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Canvas canvas(gfx::Size(200, 100), 2.25, true);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  canvas.sk_canvas()->clipRect(RectFToSkRect(gfx::RectF(100, 0, 20, 1.7f)));
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Rect clip_rect;
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(canvas.GetClipBounds(&clip_rect));
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Use Contains() rather than Equals() as skia may extend the rect in certain
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // directions. None-the-less the clip must contain the region we damaged.
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(clip_rect.Contains(gfx::Rect(100, 0, 20, 2)));
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Line height is only supported on Skia.
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_ANDROID)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_StringSizeWithLineHeight DISABLED_StringSizeWithLineHeight
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_StringSizeWithLineHeight StringSizeWithLineHeight
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CanvasTest, MAYBE_StringSizeWithLineHeight) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size one_line_size = SizeStringInt("Q", 0, 0);
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Size four_line_size = SizeStringInt("Q\nQ\nQ\nQ", 1000000, 1000);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(one_line_size.width(), four_line_size.width());
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(3 * 1000 + one_line_size.height(), four_line_size.height());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
78