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

Side by Side Diff: cc/output/gl_renderer_unittest.cc

Issue 754433003: Update from https://crrev.com/305340 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « cc/output/gl_renderer.cc ('k') | cc/output/overlay_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "cc/output/gl_renderer.h" 5 #include "cc/output/gl_renderer.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "cc/base/math_util.h" 9 #include "cc/base/math_util.h"
10 #include "cc/output/compositor_frame_metadata.h" 10 #include "cc/output/compositor_frame_metadata.h"
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 165
166 namespace { 166 namespace {
167 167
168 #if !defined(OS_ANDROID) 168 #if !defined(OS_ANDROID)
169 TEST_F(GLRendererShaderPixelTest, AllShadersCompile) { TestShaders(); } 169 TEST_F(GLRendererShaderPixelTest, AllShadersCompile) { TestShaders(); }
170 #endif 170 #endif
171 171
172 class FakeRendererGL : public GLRenderer { 172 class FakeRendererGL : public GLRenderer {
173 public: 173 public:
174 FakeRendererGL(RendererClient* client, 174 FakeRendererGL(RendererClient* client,
175 const LayerTreeSettings* settings, 175 const RendererSettings* settings,
176 OutputSurface* output_surface, 176 OutputSurface* output_surface,
177 ResourceProvider* resource_provider) 177 ResourceProvider* resource_provider)
178 : GLRenderer(client, 178 : GLRenderer(client,
179 settings, 179 settings,
180 output_surface, 180 output_surface,
181 resource_provider, 181 resource_provider,
182 NULL, 182 NULL,
183 0) {} 183 0) {}
184 184
185 // GLRenderer methods. 185 // GLRenderer methods.
(...skipping 22 matching lines...) Expand all
208 false, 208 false,
209 1).Pass(); 209 1).Pass();
210 renderer_ = make_scoped_ptr(new FakeRendererGL(&renderer_client_, 210 renderer_ = make_scoped_ptr(new FakeRendererGL(&renderer_client_,
211 &settings_, 211 &settings_,
212 output_surface_.get(), 212 output_surface_.get(),
213 resource_provider_.get())); 213 resource_provider_.get()));
214 } 214 }
215 215
216 void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); } 216 void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); }
217 217
218 LayerTreeSettings settings_; 218 RendererSettings settings_;
219 FakeOutputSurfaceClient output_surface_client_; 219 FakeOutputSurfaceClient output_surface_client_;
220 scoped_ptr<FakeOutputSurface> output_surface_; 220 scoped_ptr<FakeOutputSurface> output_surface_;
221 FakeRendererClient renderer_client_; 221 FakeRendererClient renderer_client_;
222 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 222 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
223 scoped_ptr<ResourceProvider> resource_provider_; 223 scoped_ptr<ResourceProvider> resource_provider_;
224 scoped_ptr<FakeRendererGL> renderer_; 224 scoped_ptr<FakeRendererGL> renderer_;
225 }; 225 };
226 226
227 // Closing the namespace here so that GLRendererShaderTest can take advantage 227 // Closing the namespace here so that GLRendererShaderTest can take advantage
228 // of the friend relationship with GLRenderer and all of the mock classes 228 // of the friend relationship with GLRenderer and all of the mock classes
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 [precision][sampler][blend_mode].program(), 329 [precision][sampler][blend_mode].program(),
330 renderer_->program_shadow_); 330 renderer_->program_shadow_);
331 } 331 }
332 332
333 void TestSolidColorProgramAA() { 333 void TestSolidColorProgramAA() {
334 EXPECT_PROGRAM_VALID(&renderer_->solid_color_program_aa_); 334 EXPECT_PROGRAM_VALID(&renderer_->solid_color_program_aa_);
335 EXPECT_EQ(renderer_->solid_color_program_aa_.program(), 335 EXPECT_EQ(renderer_->solid_color_program_aa_.program(),
336 renderer_->program_shadow_); 336 renderer_->program_shadow_);
337 } 337 }
338 338
339 LayerTreeSettings settings_; 339 RendererSettings settings_;
340 FakeOutputSurfaceClient output_surface_client_; 340 FakeOutputSurfaceClient output_surface_client_;
341 scoped_ptr<FakeOutputSurface> output_surface_; 341 scoped_ptr<FakeOutputSurface> output_surface_;
342 FakeRendererClient renderer_client_; 342 FakeRendererClient renderer_client_;
343 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 343 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
344 scoped_ptr<ResourceProvider> resource_provider_; 344 scoped_ptr<ResourceProvider> resource_provider_;
345 scoped_ptr<FakeRendererGL> renderer_; 345 scoped_ptr<FakeRendererGL> renderer_;
346 }; 346 };
347 347
348 namespace { 348 namespace {
349 349
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 new TestSharedBitmapManager()); 536 new TestSharedBitmapManager());
537 scoped_ptr<ResourceProvider> resource_provider( 537 scoped_ptr<ResourceProvider> resource_provider(
538 ResourceProvider::Create(output_surface.get(), 538 ResourceProvider::Create(output_surface.get(),
539 shared_bitmap_manager.get(), 539 shared_bitmap_manager.get(),
540 NULL, 540 NULL,
541 NULL, 541 NULL,
542 0, 542 0,
543 false, 543 false,
544 1)); 544 1));
545 545
546 LayerTreeSettings settings; 546 RendererSettings settings;
547 FakeRendererClient renderer_client; 547 FakeRendererClient renderer_client;
548 FakeRendererGL renderer(&renderer_client, 548 FakeRendererGL renderer(&renderer_client,
549 &settings, 549 &settings,
550 output_surface.get(), 550 output_surface.get(),
551 resource_provider.get()); 551 resource_provider.get());
552 } 552 }
553 553
554 class LoseContextOnFirstGetContext : public TestWebGraphicsContext3D { 554 class LoseContextOnFirstGetContext : public TestWebGraphicsContext3D {
555 public: 555 public:
556 LoseContextOnFirstGetContext() {} 556 LoseContextOnFirstGetContext() {}
(...skipping 19 matching lines...) Expand all
576 new TestSharedBitmapManager()); 576 new TestSharedBitmapManager());
577 scoped_ptr<ResourceProvider> resource_provider( 577 scoped_ptr<ResourceProvider> resource_provider(
578 ResourceProvider::Create(output_surface.get(), 578 ResourceProvider::Create(output_surface.get(),
579 shared_bitmap_manager.get(), 579 shared_bitmap_manager.get(),
580 NULL, 580 NULL,
581 NULL, 581 NULL,
582 0, 582 0,
583 false, 583 false,
584 1)); 584 1));
585 585
586 LayerTreeSettings settings; 586 RendererSettings settings;
587 FakeRendererClient renderer_client; 587 FakeRendererClient renderer_client;
588 FakeRendererGL renderer(&renderer_client, 588 FakeRendererGL renderer(&renderer_client,
589 &settings, 589 &settings,
590 output_surface.get(), 590 output_surface.get(),
591 resource_provider.get()); 591 resource_provider.get());
592 } 592 }
593 593
594 class ClearCountingContext : public TestWebGraphicsContext3D { 594 class ClearCountingContext : public TestWebGraphicsContext3D {
595 public: 595 public:
596 ClearCountingContext() { test_capabilities_.gpu.discard_framebuffer = true; } 596 ClearCountingContext() { test_capabilities_.gpu.discard_framebuffer = true; }
(...skipping 18 matching lines...) Expand all
615 new TestSharedBitmapManager()); 615 new TestSharedBitmapManager());
616 scoped_ptr<ResourceProvider> resource_provider( 616 scoped_ptr<ResourceProvider> resource_provider(
617 ResourceProvider::Create(output_surface.get(), 617 ResourceProvider::Create(output_surface.get(),
618 shared_bitmap_manager.get(), 618 shared_bitmap_manager.get(),
619 NULL, 619 NULL,
620 NULL, 620 NULL,
621 0, 621 0,
622 false, 622 false,
623 1)); 623 1));
624 624
625 LayerTreeSettings settings; 625 RendererSettings settings;
626 FakeRendererClient renderer_client; 626 FakeRendererClient renderer_client;
627 FakeRendererGL renderer(&renderer_client, 627 FakeRendererGL renderer(&renderer_client,
628 &settings, 628 &settings,
629 output_surface.get(), 629 output_surface.get(),
630 resource_provider.get()); 630 resource_provider.get());
631 631
632 gfx::Rect viewport_rect(1, 1); 632 gfx::Rect viewport_rect(1, 1);
633 TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_, 633 TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
634 RenderPassId(1, 0), 634 RenderPassId(1, 0),
635 viewport_rect, 635 viewport_rect,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 new TestSharedBitmapManager()); 667 new TestSharedBitmapManager());
668 scoped_ptr<ResourceProvider> resource_provider( 668 scoped_ptr<ResourceProvider> resource_provider(
669 ResourceProvider::Create(output_surface.get(), 669 ResourceProvider::Create(output_surface.get(),
670 shared_bitmap_manager.get(), 670 shared_bitmap_manager.get(),
671 NULL, 671 NULL,
672 NULL, 672 NULL,
673 0, 673 0,
674 false, 674 false,
675 1)); 675 1));
676 676
677 LayerTreeSettings settings; 677 RendererSettings settings;
678 FakeRendererClient renderer_client; 678 FakeRendererClient renderer_client;
679 FakeRendererGL renderer(&renderer_client, 679 FakeRendererGL renderer(&renderer_client,
680 &settings, 680 &settings,
681 output_surface.get(), 681 output_surface.get(),
682 resource_provider.get()); 682 resource_provider.get());
683 683
684 gfx::Rect viewport_rect(1, 1); 684 gfx::Rect viewport_rect(1, 1);
685 TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_, 685 TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
686 RenderPassId(1, 0), 686 RenderPassId(1, 0),
687 viewport_rect, 687 viewport_rect,
(...skipping 24 matching lines...) Expand all
712 new TestSharedBitmapManager()); 712 new TestSharedBitmapManager());
713 scoped_ptr<ResourceProvider> resource_provider( 713 scoped_ptr<ResourceProvider> resource_provider(
714 ResourceProvider::Create(output_surface.get(), 714 ResourceProvider::Create(output_surface.get(),
715 shared_bitmap_manager.get(), 715 shared_bitmap_manager.get(),
716 NULL, 716 NULL,
717 NULL, 717 NULL,
718 0, 718 0,
719 false, 719 false,
720 1)); 720 1));
721 721
722 LayerTreeSettings settings; 722 RendererSettings settings;
723 FakeRendererClient renderer_client; 723 FakeRendererClient renderer_client;
724 FakeRendererGL renderer(&renderer_client, 724 FakeRendererGL renderer(&renderer_client,
725 &settings, 725 &settings,
726 output_surface.get(), 726 output_surface.get(),
727 resource_provider.get()); 727 resource_provider.get());
728 728
729 gfx::Rect viewport_rect(1, 1); 729 gfx::Rect viewport_rect(1, 1);
730 AddRenderPass(&render_passes_in_draw_order_, 730 AddRenderPass(&render_passes_in_draw_order_,
731 RenderPassId(1, 0), 731 RenderPassId(1, 0),
732 viewport_rect, 732 viewport_rect,
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 new TestSharedBitmapManager()); 797 new TestSharedBitmapManager());
798 scoped_ptr<ResourceProvider> resource_provider( 798 scoped_ptr<ResourceProvider> resource_provider(
799 ResourceProvider::Create(output_surface.get(), 799 ResourceProvider::Create(output_surface.get(),
800 shared_bitmap_manager.get(), 800 shared_bitmap_manager.get(),
801 NULL, 801 NULL,
802 NULL, 802 NULL,
803 0, 803 0,
804 false, 804 false,
805 1)); 805 1));
806 806
807 LayerTreeSettings settings; 807 RendererSettings settings;
808 FakeRendererClient renderer_client; 808 FakeRendererClient renderer_client;
809 FakeRendererGL renderer(&renderer_client, 809 FakeRendererGL renderer(&renderer_client,
810 &settings, 810 &settings,
811 output_surface.get(), 811 output_surface.get(),
812 resource_provider.get()); 812 resource_provider.get());
813 813
814 gfx::Rect viewport_rect(1, 1); 814 gfx::Rect viewport_rect(1, 1);
815 AddRenderPass(&render_passes_in_draw_order_, 815 AddRenderPass(&render_passes_in_draw_order_,
816 RenderPassId(1, 0), 816 RenderPassId(1, 0),
817 viewport_rect, 817 viewport_rect,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 new TestSharedBitmapManager()); 868 new TestSharedBitmapManager());
869 scoped_ptr<ResourceProvider> resource_provider( 869 scoped_ptr<ResourceProvider> resource_provider(
870 ResourceProvider::Create(output_surface.get(), 870 ResourceProvider::Create(output_surface.get(),
871 shared_bitmap_manager.get(), 871 shared_bitmap_manager.get(),
872 NULL, 872 NULL,
873 NULL, 873 NULL,
874 0, 874 0,
875 false, 875 false,
876 1)); 876 1));
877 877
878 LayerTreeSettings settings; 878 RendererSettings settings;
879 FakeRendererClient renderer_client; 879 FakeRendererClient renderer_client;
880 FakeRendererGL renderer(&renderer_client, 880 FakeRendererGL renderer(&renderer_client,
881 &settings, 881 &settings,
882 output_surface.get(), 882 output_surface.get(),
883 resource_provider.get()); 883 resource_provider.get());
884 884
885 // During initialization we are allowed to set any texture parameters. 885 // During initialization we are allowed to set any texture parameters.
886 EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber()); 886 EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber());
887 887
888 RenderPassId id(1, 1); 888 RenderPassId id(1, 1);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
959 new TestSharedBitmapManager()); 959 new TestSharedBitmapManager());
960 scoped_ptr<ResourceProvider> resource_provider( 960 scoped_ptr<ResourceProvider> resource_provider(
961 ResourceProvider::Create(output_surface.get(), 961 ResourceProvider::Create(output_surface.get(),
962 shared_bitmap_manager.get(), 962 shared_bitmap_manager.get(),
963 NULL, 963 NULL,
964 NULL, 964 NULL,
965 0, 965 0,
966 false, 966 false,
967 1)); 967 1));
968 968
969 LayerTreeSettings settings; 969 RendererSettings settings;
970 settings.should_clear_root_render_pass = false; 970 settings.should_clear_root_render_pass = false;
971 971
972 FakeRendererClient renderer_client; 972 FakeRendererClient renderer_client;
973 FakeRendererGL renderer(&renderer_client, 973 FakeRendererGL renderer(&renderer_client,
974 &settings, 974 &settings,
975 output_surface.get(), 975 output_surface.get(),
976 resource_provider.get()); 976 resource_provider.get());
977 977
978 gfx::Rect viewport_rect(10, 10); 978 gfx::Rect viewport_rect(10, 10);
979 979
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 new TestSharedBitmapManager()); 1057 new TestSharedBitmapManager());
1058 scoped_ptr<ResourceProvider> resource_provider( 1058 scoped_ptr<ResourceProvider> resource_provider(
1059 ResourceProvider::Create(output_surface.get(), 1059 ResourceProvider::Create(output_surface.get(),
1060 shared_bitmap_manager.get(), 1060 shared_bitmap_manager.get(),
1061 NULL, 1061 NULL,
1062 NULL, 1062 NULL,
1063 0, 1063 0,
1064 false, 1064 false,
1065 1)); 1065 1));
1066 1066
1067 LayerTreeSettings settings; 1067 RendererSettings settings;
1068 FakeRendererClient renderer_client; 1068 FakeRendererClient renderer_client;
1069 FakeRendererGL renderer(&renderer_client, 1069 FakeRendererGL renderer(&renderer_client,
1070 &settings, 1070 &settings,
1071 output_surface.get(), 1071 output_surface.get(),
1072 resource_provider.get()); 1072 resource_provider.get());
1073 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); 1073 EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
1074 1074
1075 gfx::Rect viewport_rect(1, 1); 1075 gfx::Rect viewport_rect(1, 1);
1076 1076
1077 gfx::Rect grand_child_rect(25, 25); 1077 gfx::Rect grand_child_rect(25, 25);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 new TestSharedBitmapManager()); 1155 new TestSharedBitmapManager());
1156 scoped_ptr<ResourceProvider> resource_provider( 1156 scoped_ptr<ResourceProvider> resource_provider(
1157 ResourceProvider::Create(output_surface.get(), 1157 ResourceProvider::Create(output_surface.get(),
1158 shared_bitmap_manager.get(), 1158 shared_bitmap_manager.get(),
1159 NULL, 1159 NULL,
1160 NULL, 1160 NULL,
1161 0, 1161 0,
1162 false, 1162 false,
1163 1)); 1163 1));
1164 1164
1165 LayerTreeSettings settings; 1165 RendererSettings settings;
1166 settings.partial_swap_enabled = true; 1166 settings.partial_swap_enabled = true;
1167 FakeRendererClient renderer_client; 1167 FakeRendererClient renderer_client;
1168 FakeRendererGL renderer(&renderer_client, 1168 FakeRendererGL renderer(&renderer_client,
1169 &settings, 1169 &settings,
1170 output_surface.get(), 1170 output_surface.get(),
1171 resource_provider.get()); 1171 resource_provider.get());
1172 EXPECT_TRUE(renderer.Capabilities().using_partial_swap); 1172 EXPECT_TRUE(renderer.Capabilities().using_partial_swap);
1173 1173
1174 gfx::Rect viewport_rect(100, 100); 1174 gfx::Rect viewport_rect(100, 100);
1175 gfx::Rect clip_rect(100, 100); 1175 gfx::Rect clip_rect(100, 100);
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 new TestSharedBitmapManager()); 1344 new TestSharedBitmapManager());
1345 scoped_ptr<ResourceProvider> resource_provider( 1345 scoped_ptr<ResourceProvider> resource_provider(
1346 ResourceProvider::Create(output_surface.get(), 1346 ResourceProvider::Create(output_surface.get(),
1347 shared_bitmap_manager.get(), 1347 shared_bitmap_manager.get(),
1348 NULL, 1348 NULL,
1349 NULL, 1349 NULL,
1350 0, 1350 0,
1351 false, 1351 false,
1352 1)); 1352 1));
1353 1353
1354 LayerTreeSettings settings; 1354 RendererSettings settings;
1355 FakeRendererClient renderer_client; 1355 FakeRendererClient renderer_client;
1356 FakeRendererGL renderer(&renderer_client, 1356 FakeRendererGL renderer(&renderer_client,
1357 &settings, 1357 &settings,
1358 output_surface.get(), 1358 output_surface.get(),
1359 resource_provider.get()); 1359 resource_provider.get());
1360 EXPECT_FALSE(renderer.Capabilities().using_partial_swap); 1360 EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
1361 1361
1362 gfx::Rect device_viewport_rect(10, 10, 100, 100); 1362 gfx::Rect device_viewport_rect(10, 10, 100, 100);
1363 gfx::Rect viewport_rect(device_viewport_rect.size()); 1363 gfx::Rect viewport_rect(device_viewport_rect.size());
1364 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20); 1364 gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20);
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
1807 device_viewport_rect, 1807 device_viewport_rect,
1808 false); 1808 false);
1809 } 1809 }
1810 1810
1811 OutputSurfaceMockContext* Context() { 1811 OutputSurfaceMockContext* Context() {
1812 return static_cast<OutputSurfaceMockContext*>( 1812 return static_cast<OutputSurfaceMockContext*>(
1813 static_cast<TestContextProvider*>(output_surface_.context_provider()) 1813 static_cast<TestContextProvider*>(output_surface_.context_provider())
1814 ->TestContext3d()); 1814 ->TestContext3d());
1815 } 1815 }
1816 1816
1817 LayerTreeSettings settings_; 1817 RendererSettings settings_;
1818 FakeOutputSurfaceClient output_surface_client_; 1818 FakeOutputSurfaceClient output_surface_client_;
1819 StrictMock<MockOutputSurface> output_surface_; 1819 StrictMock<MockOutputSurface> output_surface_;
1820 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; 1820 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
1821 scoped_ptr<ResourceProvider> resource_provider_; 1821 scoped_ptr<ResourceProvider> resource_provider_;
1822 FakeRendererClient renderer_client_; 1822 FakeRendererClient renderer_client_;
1823 scoped_ptr<FakeRendererGL> renderer_; 1823 scoped_ptr<FakeRendererGL> renderer_;
1824 }; 1824 };
1825 1825
1826 TEST_F(MockOutputSurfaceTest, DrawFrameAndSwap) { 1826 TEST_F(MockOutputSurfaceTest, DrawFrameAndSwap) {
1827 gfx::Rect device_viewport_rect(1, 1); 1827 gfx::Rect device_viewport_rect(1, 1);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1925 base::MessageLoop::current()->Run(); 1925 base::MessageLoop::current()->Run();
1926 1926
1927 // The sync point should have happened. 1927 // The sync point should have happened.
1928 EXPECT_EQ(1, sync_point_callback_count); 1928 EXPECT_EQ(1, sync_point_callback_count);
1929 EXPECT_EQ(1, other_callback_count); 1929 EXPECT_EQ(1, other_callback_count);
1930 } 1930 }
1931 #endif // OS_ANDROID 1931 #endif // OS_ANDROID
1932 1932
1933 } // namespace 1933 } // namespace
1934 } // namespace cc 1934 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/gl_renderer.cc ('k') | cc/output/overlay_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698