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

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

Issue 23740010: Revert 223162 "Update the nine patch layer to use UI resources" (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: 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 | Annotate | Revision Log
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 "base/containers/hash_tables.h" 5 #include <stdio.h>
6
6 #include "cc/layers/append_quads_data.h" 7 #include "cc/layers/append_quads_data.h"
7 #include "cc/layers/nine_patch_layer_impl.h" 8 #include "cc/layers/nine_patch_layer_impl.h"
8 #include "cc/quads/texture_draw_quad.h" 9 #include "cc/quads/texture_draw_quad.h"
9 #include "cc/resources/ui_resource_bitmap.h"
10 #include "cc/resources/ui_resource_client.h"
11 #include "cc/test/fake_impl_proxy.h" 10 #include "cc/test/fake_impl_proxy.h"
12 #include "cc/test/fake_layer_tree_host_impl.h" 11 #include "cc/test/fake_layer_tree_host_impl.h"
13 #include "cc/test/geometry_test_utils.h" 12 #include "cc/test/geometry_test_utils.h"
14 #include "cc/test/layer_test_common.h" 13 #include "cc/test/layer_test_common.h"
15 #include "cc/test/mock_quad_culler.h" 14 #include "cc/test/mock_quad_culler.h"
16 #include "cc/trees/single_thread_proxy.h" 15 #include "cc/trees/single_thread_proxy.h"
17 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
19 #include "ui/gfx/rect_conversions.h" 18 #include "ui/gfx/rect_conversions.h"
20 #include "ui/gfx/safe_integer_conversions.h" 19 #include "ui/gfx/safe_integer_conversions.h"
21 #include "ui/gfx/transform.h" 20 #include "ui/gfx/transform.h"
22 21
23 namespace cc { 22 namespace cc {
24 namespace { 23 namespace {
25 24
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
60 gfx::Rect ToRoundedIntRect(gfx::RectF rect_f) { 25 gfx::Rect ToRoundedIntRect(gfx::RectF rect_f) {
61 return gfx::Rect(gfx::ToRoundedInt(rect_f.x()), 26 return gfx::Rect(gfx::ToRoundedInt(rect_f.x()),
62 gfx::ToRoundedInt(rect_f.y()), 27 gfx::ToRoundedInt(rect_f.y()),
63 gfx::ToRoundedInt(rect_f.width()), 28 gfx::ToRoundedInt(rect_f.width()),
64 gfx::ToRoundedInt(rect_f.height())); 29 gfx::ToRoundedInt(rect_f.height()));
65 } 30 }
66 31
67 void NinePatchLayerLayoutTest(gfx::Size bitmap_size, 32 TEST(NinePatchLayerImplTest, VerifyDrawQuads) {
68 gfx::Rect aperture_rect, 33 // Input is a 100x100 bitmap with a 40x50 aperture at x=20, y=30.
69 gfx::Size layer_size, 34 // The bounds of the layer are set to 400x400, so the draw quads
70 gfx::Rect border, 35 // generated should leave the border width (40) intact.
71 bool fill_center,
72 size_t expected_quad_size) {
73 MockQuadCuller quad_culler; 36 MockQuadCuller quad_culler;
37 gfx::Size bitmap_size(100, 100);
38 gfx::Size layer_size(400, 400);
74 gfx::Rect visible_content_rect(layer_size); 39 gfx::Rect visible_content_rect(layer_size);
75 gfx::Rect expected_remaining(border.x(), 40 gfx::Rect aperture_rect(20, 30, 40, 50);
76 border.y(), 41 gfx::Rect scaled_aperture_non_uniform(20, 30, 340, 350);
77 layer_size.width() - border.width(),
78 layer_size.height() - border.height());
79 42
80 FakeImplProxy proxy; 43 FakeImplProxy proxy;
81 FakeUIResourceLayerTreeHostImpl host_impl(&proxy); 44 FakeLayerTreeHostImpl host_impl(&proxy);
82 scoped_ptr<NinePatchLayerImpl> layer = 45 scoped_ptr<NinePatchLayerImpl> layer =
83 NinePatchLayerImpl::Create(host_impl.active_tree(), 1); 46 NinePatchLayerImpl::Create(host_impl.active_tree(), 1);
84 layer->draw_properties().visible_content_rect = visible_content_rect; 47 layer->draw_properties().visible_content_rect = visible_content_rect;
85 layer->SetBounds(layer_size); 48 layer->SetBounds(layer_size);
86 layer->SetContentBounds(layer_size); 49 layer->SetContentBounds(layer_size);
87 layer->CreateRenderSurface(); 50 layer->CreateRenderSurface();
88 layer->draw_properties().render_target = layer.get(); 51 layer->draw_properties().render_target = layer.get();
52 layer->SetLayout(bitmap_size, aperture_rect);
53 layer->SetResourceId(1);
89 54
90 UIResourceId uid = 1; 55 // This scale should not affect the generated quad geometry, but only
91 SkBitmap skbitmap; 56 // the shared draw transform.
92 skbitmap.setConfig( 57 gfx::Transform transform;
93 SkBitmap::kARGB_8888_Config, bitmap_size.width(), bitmap_size.height()); 58 transform.Scale(10, 10);
94 skbitmap.allocPixels(); 59 layer->draw_properties().target_space_transform = transform;
95 skbitmap.setImmutable();
96 UIResourceBitmap bitmap(skbitmap);
97 60
98 host_impl.CreateUIResource(uid, bitmap);
99 layer->SetUIResourceId(uid);
100
101 layer->SetLayout(bitmap_size, aperture_rect, border, fill_center);
102 AppendQuadsData data; 61 AppendQuadsData data;
103 layer->AppendQuads(&quad_culler, &data); 62 layer->AppendQuads(&quad_culler, &data);
104 63
105 // Verify quad rects 64 // Verify quad rects
106 const QuadList& quads = quad_culler.quad_list(); 65 const QuadList& quads = quad_culler.quad_list();
107 EXPECT_EQ(expected_quad_size, quads.size()); 66 EXPECT_EQ(8u, quads.size());
108
109 Region remaining(visible_content_rect); 67 Region remaining(visible_content_rect);
110 for (size_t i = 0; i < quads.size(); ++i) { 68 for (size_t i = 0; i < quads.size(); ++i) {
111 DrawQuad* quad = quads[i]; 69 DrawQuad* quad = quads[i];
112 gfx::Rect quad_rect = quad->rect; 70 gfx::Rect quad_rect = quad->rect;
113 71
114 EXPECT_TRUE(visible_content_rect.Contains(quad_rect)) << i; 72 EXPECT_TRUE(visible_content_rect.Contains(quad_rect)) << i;
115 EXPECT_TRUE(remaining.Contains(quad_rect)) << i; 73 EXPECT_TRUE(remaining.Contains(quad_rect)) << i;
74 EXPECT_EQ(transform, quad->quadTransform());
116 remaining.Subtract(Region(quad_rect)); 75 remaining.Subtract(Region(quad_rect));
117 } 76 }
118 77 EXPECT_RECT_EQ(scaled_aperture_non_uniform, remaining.bounds());
119 // Check if the left-over quad is the same size as the mapped aperture quad in 78 Region scaled_aperture_region(scaled_aperture_non_uniform);
120 // layer space. 79 EXPECT_EQ(scaled_aperture_region, remaining);
121 if (!fill_center) {
122 EXPECT_RECT_EQ(expected_remaining, gfx::ToEnclosedRect(remaining.bounds()));
123 } else {
124 EXPECT_TRUE(remaining.bounds().IsEmpty());
125 }
126 80
127 // Verify UV rects 81 // Verify UV rects
128 gfx::Rect bitmap_rect(bitmap_size); 82 gfx::Rect bitmap_rect(bitmap_size);
129 Region tex_remaining(bitmap_rect); 83 Region tex_remaining(bitmap_rect);
130 for (size_t i = 0; i < quads.size(); ++i) { 84 for (size_t i = 0; i < quads.size(); ++i) {
131 DrawQuad* quad = quads[i]; 85 DrawQuad* quad = quads[i];
132 const TextureDrawQuad* tex_quad = TextureDrawQuad::MaterialCast(quad); 86 const TextureDrawQuad* tex_quad = TextureDrawQuad::MaterialCast(quad);
133 gfx::RectF tex_rect = 87 gfx::RectF tex_rect =
134 gfx::BoundingRect(tex_quad->uv_top_left, tex_quad->uv_bottom_right); 88 gfx::BoundingRect(tex_quad->uv_top_left, tex_quad->uv_bottom_right);
135 tex_rect.Scale(bitmap_size.width(), bitmap_size.height()); 89 tex_rect.Scale(bitmap_size.width(), bitmap_size.height());
136 tex_remaining.Subtract(Region(ToRoundedIntRect(tex_rect))); 90 tex_remaining.Subtract(Region(ToRoundedIntRect(tex_rect)));
137 } 91 }
138 92 EXPECT_RECT_EQ(aperture_rect, tex_remaining.bounds());
139 if (!fill_center) { 93 Region aperture_region(aperture_rect);
140 EXPECT_RECT_EQ(aperture_rect, tex_remaining.bounds()); 94 EXPECT_EQ(aperture_region, tex_remaining);
141 Region aperture_region(aperture_rect);
142 EXPECT_EQ(aperture_region, tex_remaining);
143 } else {
144 EXPECT_TRUE(remaining.bounds().IsEmpty());
145 }
146 } 95 }
147 96
148 TEST(NinePatchLayerImplTest, VerifyDrawQuads) { 97 TEST(NinePatchLayerImplTest, VerifyDrawQuadsForSqueezedLayer) {
149 // Input is a 100x100 bitmap with a 40x50 aperture at x=20, y=30. 98 // Test with a layer much smaller than the bitmap.
150 // The bounds of the layer are set to 400x400. 99 MockQuadCuller quad_culler;
151 gfx::Size bitmap_size(100, 100); 100 gfx::Size bitmap_size(101, 101);
152 gfx::Size layer_size(400, 500); 101 gfx::Size layer_size(51, 51);
153 gfx::Rect aperture_rect(20, 30, 40, 50); 102 gfx::Rect visible_content_rect(layer_size);
154 gfx::Rect border(40, 40, 80, 80); 103 gfx::Rect aperture_rect(20, 30, 40, 45); // rightWidth: 40, botHeight: 25
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);
163 104
164 // The bounds of the layer are set to less than the bitmap size. 105 FakeImplProxy proxy;
165 bitmap_size = gfx::Size(100, 100); 106 FakeLayerTreeHostImpl host_impl(&proxy);
166 layer_size = gfx::Size(40, 50); 107 scoped_ptr<NinePatchLayerImpl> layer =
167 aperture_rect = gfx::Rect(20, 30, 40, 50); 108 NinePatchLayerImpl::Create(host_impl.active_tree(), 1);
168 border = gfx::Rect(10, 10, 25, 15); 109 layer->draw_properties().visible_content_rect = visible_content_rect;
169 fill_center = true; 110 layer->SetBounds(layer_size);
170 expected_quad_size = 9; 111 layer->SetContentBounds(layer_size);
171 NinePatchLayerLayoutTest(bitmap_size, 112 layer->CreateRenderSurface();
172 aperture_rect, 113 layer->draw_properties().render_target = layer.get();
173 layer_size, 114 layer->SetLayout(bitmap_size, aperture_rect);
174 border, 115 layer->SetResourceId(1);
175 fill_center,
176 expected_quad_size);
177 116
178 // Layer and image sizes are equal. 117 AppendQuadsData data;
179 bitmap_size = gfx::Size(100, 100); 118 layer->AppendQuads(&quad_culler, &data);
180 layer_size = gfx::Size(100, 100); 119
181 aperture_rect = gfx::Rect(20, 30, 40, 50); 120 // Verify corner rects fill the layer and don't overlap
182 border = gfx::Rect(20, 30, 40, 50); 121 const QuadList& quads = quad_culler.quad_list();
183 fill_center = true; 122 EXPECT_EQ(4u, quads.size());
184 expected_quad_size = 9; 123 Region filled;
185 NinePatchLayerLayoutTest(bitmap_size, 124 for (size_t i = 0; i < quads.size(); ++i) {
186 aperture_rect, 125 DrawQuad* quad = quads[i];
187 layer_size, 126 gfx::Rect quad_rect = quad->rect;
188 border, 127
189 fill_center, 128 EXPECT_FALSE(filled.Intersects(quad_rect));
190 expected_quad_size); 129 filled.Union(quad_rect);
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);
191 } 152 }
192 153
193 } // namespace 154 } // namespace
194 } // namespace cc 155 } // namespace cc
OLDNEW
« no previous file with comments | « trunk/src/cc/layers/nine_patch_layer_impl.cc ('k') | trunk/src/cc/layers/nine_patch_layer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698