Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(283)

Side by Side Diff: cc/layers/nine_patch_layer_impl_unittest.cc

Issue 22870016: Update the nine patch layer to use UI resources (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: ccameron's fix for exisiting nine-patch uses Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdio.h> 5 #include "base/containers/hash_tables.h"
6
7 #include "cc/layers/append_quads_data.h" 6 #include "cc/layers/append_quads_data.h"
8 #include "cc/layers/nine_patch_layer_impl.h" 7 #include "cc/layers/nine_patch_layer_impl.h"
9 #include "cc/quads/texture_draw_quad.h" 8 #include "cc/quads/texture_draw_quad.h"
9 #include "cc/resources/ui_resource_bitmap.h"
10 #include "cc/resources/ui_resource_client.h"
10 #include "cc/test/fake_impl_proxy.h" 11 #include "cc/test/fake_impl_proxy.h"
11 #include "cc/test/fake_layer_tree_host_impl.h" 12 #include "cc/test/fake_layer_tree_host_impl.h"
12 #include "cc/test/geometry_test_utils.h" 13 #include "cc/test/geometry_test_utils.h"
13 #include "cc/test/layer_test_common.h" 14 #include "cc/test/layer_test_common.h"
14 #include "cc/test/mock_quad_culler.h" 15 #include "cc/test/mock_quad_culler.h"
15 #include "cc/trees/single_thread_proxy.h" 16 #include "cc/trees/single_thread_proxy.h"
16 #include "testing/gmock/include/gmock/gmock.h" 17 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
18 #include "ui/gfx/rect_conversions.h" 19 #include "ui/gfx/rect_conversions.h"
19 #include "ui/gfx/safe_integer_conversions.h" 20 #include "ui/gfx/safe_integer_conversions.h"
20 #include "ui/gfx/transform.h" 21 #include "ui/gfx/transform.h"
21 22
22 namespace cc { 23 namespace cc {
23 namespace { 24 namespace {
24 25
26 class FakeUIResourceLayerTreeHostImpl : public FakeLayerTreeHostImpl {
27 public:
28 explicit FakeUIResourceLayerTreeHostImpl(Proxy* proxy)
29 : FakeLayerTreeHostImpl(proxy), fake_next_resource_id_(1) {}
30
31 virtual void CreateUIResource(
32 UIResourceId uid,
33 const UIResourceBitmap& bitmap) OVERRIDE {
34 if (ResourceIdForUIResource(uid))
35 DeleteUIResource(uid);
36 fake_ui_resource_map_[uid] = fake_next_resource_id_;
37 }
38
39 virtual void DeleteUIResource(UIResourceId uid) OVERRIDE {
40 ResourceProvider::ResourceId id = ResourceIdForUIResource(uid);
41 if (id)
42 fake_ui_resource_map_.erase(uid);
43 }
44
45 virtual ResourceProvider::ResourceId ResourceIdForUIResource(
46 UIResourceId uid) const OVERRIDE {
47 UIResourceMap::const_iterator iter = fake_ui_resource_map_.find(uid);
48 if (iter != fake_ui_resource_map_.end())
49 return iter->second;
50 return 0;
51 }
52
53 private:
54 ResourceProvider::ResourceId fake_next_resource_id_;
55 typedef base::hash_map<UIResourceId, ResourceProvider::ResourceId>
56 UIResourceMap;
57 UIResourceMap fake_ui_resource_map_;
58 };
59
25 gfx::Rect ToRoundedIntRect(gfx::RectF rect_f) { 60 gfx::Rect ToRoundedIntRect(gfx::RectF rect_f) {
26 return gfx::Rect(gfx::ToRoundedInt(rect_f.x()), 61 return gfx::Rect(gfx::ToRoundedInt(rect_f.x()),
27 gfx::ToRoundedInt(rect_f.y()), 62 gfx::ToRoundedInt(rect_f.y()),
28 gfx::ToRoundedInt(rect_f.width()), 63 gfx::ToRoundedInt(rect_f.width()),
29 gfx::ToRoundedInt(rect_f.height())); 64 gfx::ToRoundedInt(rect_f.height()));
30 } 65 }
31 66
32 TEST(NinePatchLayerImplTest, VerifyDrawQuads) { 67 void NinePatchLayerLayoutTest(gfx::Size bitmap_size,
33 // Input is a 100x100 bitmap with a 40x50 aperture at x=20, y=30. 68 gfx::Rect aperture_rect,
34 // The bounds of the layer are set to 400x400, so the draw quads 69 gfx::Size layer_size,
35 // generated should leave the border width (40) intact. 70 gfx::Rect border,
71 bool fill_center,
72 size_t expected_quad_size) {
36 MockQuadCuller quad_culler; 73 MockQuadCuller quad_culler;
37 gfx::Size bitmap_size(100, 100);
38 gfx::Size layer_size(400, 400);
39 gfx::Rect visible_content_rect(layer_size); 74 gfx::Rect visible_content_rect(layer_size);
40 gfx::Rect aperture_rect(20, 30, 40, 50); 75 gfx::Rect expected_remaining(border.x(),
41 gfx::Rect scaled_aperture_non_uniform(20, 30, 340, 350); 76 border.y(),
77 layer_size.width() - border.width(),
78 layer_size.height() - border.height());
42 79
43 FakeImplProxy proxy; 80 FakeImplProxy proxy;
44 FakeLayerTreeHostImpl host_impl(&proxy); 81 FakeUIResourceLayerTreeHostImpl host_impl(&proxy);
45 scoped_ptr<NinePatchLayerImpl> layer = 82 scoped_ptr<NinePatchLayerImpl> layer =
46 NinePatchLayerImpl::Create(host_impl.active_tree(), 1); 83 NinePatchLayerImpl::Create(host_impl.active_tree(), 1);
47 layer->draw_properties().visible_content_rect = visible_content_rect; 84 layer->draw_properties().visible_content_rect = visible_content_rect;
48 layer->SetBounds(layer_size); 85 layer->SetBounds(layer_size);
49 layer->SetContentBounds(layer_size); 86 layer->SetContentBounds(layer_size);
50 layer->CreateRenderSurface(); 87 layer->CreateRenderSurface();
51 layer->draw_properties().render_target = layer.get(); 88 layer->draw_properties().render_target = layer.get();
52 layer->SetLayout(bitmap_size, aperture_rect);
53 layer->SetResourceId(1);
54 89
55 // This scale should not affect the generated quad geometry, but only 90 UIResourceId uid = 1;
56 // the shared draw transform. 91 SkBitmap skbitmap;
57 gfx::Transform transform; 92 skbitmap.setConfig(
58 transform.Scale(10, 10); 93 SkBitmap::kARGB_8888_Config, bitmap_size.width(), bitmap_size.height());
59 layer->draw_properties().target_space_transform = transform; 94 skbitmap.allocPixels();
95 skbitmap.setImmutable();
96 UIResourceBitmap bitmap(skbitmap);
60 97
98 host_impl.CreateUIResource(uid, bitmap);
99 layer->SetUIResourceId(uid);
100
101 layer->SetLayout(bitmap_size, aperture_rect, border, fill_center);
61 AppendQuadsData data; 102 AppendQuadsData data;
62 layer->AppendQuads(&quad_culler, &data); 103 layer->AppendQuads(&quad_culler, &data);
63 104
64 // Verify quad rects 105 // Verify quad rects
65 const QuadList& quads = quad_culler.quad_list(); 106 const QuadList& quads = quad_culler.quad_list();
66 EXPECT_EQ(8u, quads.size()); 107 EXPECT_EQ(expected_quad_size, quads.size());
108
67 Region remaining(visible_content_rect); 109 Region remaining(visible_content_rect);
68 for (size_t i = 0; i < quads.size(); ++i) { 110 for (size_t i = 0; i < quads.size(); ++i) {
69 DrawQuad* quad = quads[i]; 111 DrawQuad* quad = quads[i];
70 gfx::Rect quad_rect = quad->rect; 112 gfx::Rect quad_rect = quad->rect;
71 113
72 EXPECT_TRUE(visible_content_rect.Contains(quad_rect)) << i; 114 EXPECT_TRUE(visible_content_rect.Contains(quad_rect)) << i;
73 EXPECT_TRUE(remaining.Contains(quad_rect)) << i; 115 EXPECT_TRUE(remaining.Contains(quad_rect)) << i;
74 EXPECT_EQ(transform, quad->quadTransform());
75 remaining.Subtract(Region(quad_rect)); 116 remaining.Subtract(Region(quad_rect));
76 } 117 }
77 EXPECT_RECT_EQ(scaled_aperture_non_uniform, remaining.bounds()); 118
78 Region scaled_aperture_region(scaled_aperture_non_uniform); 119 // Check if the left-over quad is the same size as the mapped aperture quad in
79 EXPECT_EQ(scaled_aperture_region, remaining); 120 // layer space.
121 if (!fill_center) {
122 EXPECT_RECT_EQ(expected_remaining, gfx::ToEnclosedRect(remaining.bounds()));
123 } else {
124 EXPECT_TRUE(remaining.bounds().IsEmpty());
125 }
80 126
81 // Verify UV rects 127 // Verify UV rects
82 gfx::Rect bitmap_rect(bitmap_size); 128 gfx::Rect bitmap_rect(bitmap_size);
83 Region tex_remaining(bitmap_rect); 129 Region tex_remaining(bitmap_rect);
84 for (size_t i = 0; i < quads.size(); ++i) { 130 for (size_t i = 0; i < quads.size(); ++i) {
85 DrawQuad* quad = quads[i]; 131 DrawQuad* quad = quads[i];
86 const TextureDrawQuad* tex_quad = TextureDrawQuad::MaterialCast(quad); 132 const TextureDrawQuad* tex_quad = TextureDrawQuad::MaterialCast(quad);
87 gfx::RectF tex_rect = 133 gfx::RectF tex_rect =
88 gfx::BoundingRect(tex_quad->uv_top_left, tex_quad->uv_bottom_right); 134 gfx::BoundingRect(tex_quad->uv_top_left, tex_quad->uv_bottom_right);
89 tex_rect.Scale(bitmap_size.width(), bitmap_size.height()); 135 tex_rect.Scale(bitmap_size.width(), bitmap_size.height());
90 tex_remaining.Subtract(Region(ToRoundedIntRect(tex_rect))); 136 tex_remaining.Subtract(Region(ToRoundedIntRect(tex_rect)));
91 } 137 }
92 EXPECT_RECT_EQ(aperture_rect, tex_remaining.bounds()); 138
93 Region aperture_region(aperture_rect); 139 if (!fill_center) {
94 EXPECT_EQ(aperture_region, tex_remaining); 140 EXPECT_RECT_EQ(aperture_rect, tex_remaining.bounds());
141 Region aperture_region(aperture_rect);
142 EXPECT_EQ(aperture_region, tex_remaining);
143 } else {
144 EXPECT_TRUE(remaining.bounds().IsEmpty());
145 }
95 } 146 }
96 147
97 TEST(NinePatchLayerImplTest, VerifyDrawQuadsForSqueezedLayer) { 148 TEST(NinePatchLayerImplTest, VerifyDrawQuads) {
98 // Test with a layer much smaller than the bitmap. 149 // Input is a 100x100 bitmap with a 40x50 aperture at x=20, y=30.
99 MockQuadCuller quad_culler; 150 // The bounds of the layer are set to 400x400.
100 gfx::Size bitmap_size(101, 101); 151 gfx::Size bitmap_size(100, 100);
101 gfx::Size layer_size(51, 51); 152 gfx::Size layer_size(400, 500);
102 gfx::Rect visible_content_rect(layer_size); 153 gfx::Rect aperture_rect(20, 30, 40, 50);
103 gfx::Rect aperture_rect(20, 30, 40, 45); // rightWidth: 40, botHeight: 25 154 gfx::Rect border(40, 40, 80, 80);
155 bool fill_center = false;
156 size_t expected_quad_size = 8;
157 NinePatchLayerLayoutTest(bitmap_size,
158 aperture_rect,
159 layer_size,
160 border,
161 fill_center,
162 expected_quad_size);
104 163
105 FakeImplProxy proxy; 164 // The bounds of the layer are set to less than the bitmap size.
106 FakeLayerTreeHostImpl host_impl(&proxy); 165 bitmap_size = gfx::Size(100, 100);
107 scoped_ptr<NinePatchLayerImpl> layer = 166 layer_size = gfx::Size(40, 50);
108 NinePatchLayerImpl::Create(host_impl.active_tree(), 1); 167 aperture_rect = gfx::Rect(20, 30, 40, 50);
109 layer->draw_properties().visible_content_rect = visible_content_rect; 168 border = gfx::Rect(10, 10, 25, 15);
110 layer->SetBounds(layer_size); 169 fill_center = true;
111 layer->SetContentBounds(layer_size); 170 expected_quad_size = 9;
112 layer->CreateRenderSurface(); 171 NinePatchLayerLayoutTest(bitmap_size,
113 layer->draw_properties().render_target = layer.get(); 172 aperture_rect,
114 layer->SetLayout(bitmap_size, aperture_rect); 173 layer_size,
115 layer->SetResourceId(1); 174 border,
175 fill_center,
176 expected_quad_size);
116 177
117 AppendQuadsData data; 178 // Layer and image sizes are equal.
118 layer->AppendQuads(&quad_culler, &data); 179 bitmap_size = gfx::Size(100, 100);
119 180 layer_size = gfx::Size(100, 100);
120 // Verify corner rects fill the layer and don't overlap 181 aperture_rect = gfx::Rect(20, 30, 40, 50);
121 const QuadList& quads = quad_culler.quad_list(); 182 border = gfx::Rect(20, 30, 40, 50);
122 EXPECT_EQ(4u, quads.size()); 183 fill_center = true;
123 Region filled; 184 expected_quad_size = 9;
124 for (size_t i = 0; i < quads.size(); ++i) { 185 NinePatchLayerLayoutTest(bitmap_size,
125 DrawQuad* quad = quads[i]; 186 aperture_rect,
126 gfx::Rect quad_rect = quad->rect; 187 layer_size,
127 188 border,
128 EXPECT_FALSE(filled.Intersects(quad_rect)); 189 fill_center,
129 filled.Union(quad_rect); 190 expected_quad_size);
130 }
131 Region expected_full(visible_content_rect);
132 EXPECT_EQ(expected_full, filled);
133
134 // Verify UV rects cover the corners of the bitmap and the crop is weighted
135 // proportionately to the relative corner sizes (for uneven apertures).
136 gfx::Rect bitmap_rect(bitmap_size);
137 Region tex_remaining(bitmap_rect);
138 for (size_t i = 0; i < quads.size(); ++i) {
139 DrawQuad* quad = quads[i];
140 const TextureDrawQuad* tex_quad = TextureDrawQuad::MaterialCast(quad);
141 gfx::RectF tex_rect =
142 gfx::BoundingRect(tex_quad->uv_top_left, tex_quad->uv_bottom_right);
143 tex_rect.Scale(bitmap_size.width(), bitmap_size.height());
144 tex_remaining.Subtract(Region(ToRoundedIntRect(tex_rect)));
145 }
146 Region expected_remaining_region = Region(gfx::Rect(bitmap_size));
147 expected_remaining_region.Subtract(gfx::Rect(0, 0, 17, 28));
148 expected_remaining_region.Subtract(gfx::Rect(67, 0, 34, 28));
149 expected_remaining_region.Subtract(gfx::Rect(0, 78, 17, 23));
150 expected_remaining_region.Subtract(gfx::Rect(67, 78, 34, 23));
151 EXPECT_EQ(expected_remaining_region, tex_remaining);
152 } 191 }
153 192
154 } // namespace 193 } // namespace
155 } // namespace cc 194 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698