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

Unified Diff: cc/output/renderer_pixeltest.cc

Issue 14001009: cc: Add pixel tests for PictureDrawQuad (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | cc/resources/picture_pile_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/renderer_pixeltest.cc
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index fa06ea8b5ade83e22770b7e467f23ebf2882681c..71eb8c07198fcb37664d2c4b8deac21d31a82ec5 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -6,13 +6,17 @@
#include "cc/layers/append_quads_data.h"
#include "cc/output/gl_renderer.h"
#include "cc/quads/draw_quad.h"
+#include "cc/quads/picture_draw_quad.h"
+#include "cc/resources/platform_color.h"
#include "cc/resources/sync_point_helper.h"
+#include "cc/test/fake_picture_pile_impl.h"
#include "cc/test/pixel_test.h"
#include "gpu/GLES2/gl2extchromium.h"
#include "third_party/skia/include/core/SkImageFilter.h"
#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
#include "third_party/skia/include/effects/SkColorMatrixFilter.h"
+#include "ui/gfx/rect_conversions.h"
namespace cc {
namespace {
@@ -55,6 +59,24 @@ scoped_ptr<SharedQuadState> CreateTestSharedQuadState(
return shared_state.Pass();
}
+scoped_ptr<SharedQuadState> CreateTestSharedQuadStateClipped(
+ gfx::Transform content_to_target_transform,
+ gfx::Rect rect,
+ gfx::Rect clip_rect) {
+ const gfx::Size content_bounds = rect.size();
+ const gfx::Rect visible_content_rect = clip_rect;
+ const bool is_clipped = true;
+ const float opacity = 1.0f;
+ scoped_ptr<SharedQuadState> shared_state = SharedQuadState::Create();
+ shared_state->SetAll(content_to_target_transform,
+ content_bounds,
+ visible_content_rect,
+ clip_rect,
+ is_clipped,
+ opacity);
+ return shared_state.Pass();
+}
+
scoped_ptr<DrawQuad> CreateTestRenderPassDrawQuad(
SharedQuadState* shared_state, gfx::Rect rect, RenderPass::Id pass_id) {
scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create();
@@ -652,7 +674,233 @@ TEST_F(GLRendererPixelTest, SignalSyncPoint) {
EXPECT_EQ(1, sync_point_callback_count);
EXPECT_EQ(1, other_callback_count);
}
-#endif
+
+TEST_F(GLRendererPixelTest, PictureDrawQuadIdentityScale) {
+ gfx::Size pile_tile_size(1000, 1000);
+ gfx::Rect viewport(this->device_viewport_size_);
+ // TODO(enne): the renderer should figure this out on its own.
+ bool contents_swizzled = !PlatformColor::SameComponentOrder(GL_RGBA);
+
+ RenderPass::Id id(1, 1);
+ gfx::Transform transform_to_root;
+ scoped_ptr<RenderPass> pass =
+ CreateTestRenderPass(id, viewport, transform_to_root);
+
+ // One clipped blue quad in the lower right corner. Outside the clip
+ // is red, which should not appear.
+ gfx::Rect blue_rect(gfx::Size(100, 100));
+ gfx::Rect blue_clip_rect(gfx::Point(50, 50), gfx::Size(50, 50));
+ scoped_refptr<FakePicturePileImpl> blue_pile =
+ FakePicturePileImpl::CreateFilledPile(pile_tile_size, blue_rect.size());
+ SkPaint red_paint;
+ red_paint.setColor(SK_ColorRED);
+ blue_pile->add_draw_rect_with_paint(blue_rect, red_paint);
+ SkPaint blue_paint;
+ blue_paint.setColor(SK_ColorBLUE);
+ blue_pile->add_draw_rect_with_paint(blue_clip_rect, blue_paint);
+ blue_pile->RerecordPile();
+
+ gfx::Transform blue_content_to_target_transform;
+ gfx::Vector2d offset(viewport.bottom_right() - blue_rect.bottom_right());
+ blue_content_to_target_transform.Translate(offset.x(), offset.y());
+ gfx::RectF blue_scissor_rect = blue_clip_rect;
+ blue_content_to_target_transform.TransformRect(&blue_scissor_rect);
+ scoped_ptr<SharedQuadState> blue_shared_state =
+ CreateTestSharedQuadStateClipped(blue_content_to_target_transform,
+ blue_rect,
+ gfx::ToEnclosingRect(blue_scissor_rect));
+
+ scoped_ptr<PictureDrawQuad> blue_quad = PictureDrawQuad::Create();
+
+ blue_quad->SetNew(blue_shared_state.get(),
+ viewport, // intentionally bigger than clip
danakj 2013/04/29 14:27:02 Intentionally bigger than clip.
+ gfx::Rect(),
+ viewport,
+ viewport.size(),
+ contents_swizzled,
+ viewport,
+ 1.f,
+ blue_pile);
+ pass->quad_list.push_back(blue_quad.PassAs<DrawQuad>());
+
+ // One viewport-filling green quad.
+ scoped_refptr<FakePicturePileImpl> green_pile =
+ FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
+ SkPaint green_paint;
+ green_paint.setColor(SK_ColorGREEN);
+ green_pile->add_draw_rect_with_paint(viewport, green_paint);
+ green_pile->RerecordPile();
+
+ gfx::Transform green_content_to_target_transform;
+ scoped_ptr<SharedQuadState> green_shared_state =
+ CreateTestSharedQuadState(green_content_to_target_transform, viewport);
+
+ scoped_ptr<PictureDrawQuad> green_quad = PictureDrawQuad::Create();
+ green_quad->SetNew(green_shared_state.get(),
+ viewport,
+ gfx::Rect(),
+ gfx::RectF(0.f, 0.f, 1.f, 1.f),
+ viewport.size(),
+ contents_swizzled,
+ viewport,
+ 1.f,
+ green_pile);
+ pass->quad_list.push_back(green_quad.PassAs<DrawQuad>());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ EXPECT_TRUE(this->RunPixelTest(
+ &pass_list,
+ base::FilePath(FILE_PATH_LITERAL("green_with_blue_corner.png")),
+ ExactPixelComparator(true)));
+}
+
+TEST_F(GLRendererPixelTest, PictureDrawQuadNonIdentityScale) {
+ gfx::Size pile_tile_size(1000, 1000);
+ gfx::Rect viewport(gfx::Size(200, 200));
+ // TODO(enne): the renderer should figure this out on its own.
+ bool contents_swizzled = !PlatformColor::SameComponentOrder(GL_RGBA);
+
+ RenderPass::Id id(1, 1);
+ gfx::Transform transform_to_root;
+ scoped_ptr<RenderPass> pass =
+ CreateTestRenderPass(id, viewport, transform_to_root);
+
+ // As scaling up the blue checkerboards will cause sampling on the GPU,
+ // a few extra "cleanup rects" need to be added to clobber the blending
+ // to make the output image more clean. This will also test subrects
+ // of the layer.
+ gfx::Transform green_content_to_target_transform;
+ gfx::Rect green_rect1(gfx::Point(80, 0), gfx::Size(20, 100));
+ gfx::Rect green_rect2(gfx::Point(0, 80), gfx::Size(100, 20));
+ scoped_refptr<FakePicturePileImpl> green_pile =
+ FakePicturePileImpl::CreateFilledPile(pile_tile_size, viewport.size());
+ SkPaint red_paint;
+ red_paint.setColor(SK_ColorRED);
+ green_pile->add_draw_rect_with_paint(viewport, red_paint);
+ SkPaint green_paint;
+ green_paint.setColor(SK_ColorGREEN);
+ green_pile->add_draw_rect_with_paint(green_rect1, green_paint);
+ green_pile->add_draw_rect_with_paint(green_rect2, green_paint);
+ green_pile->RerecordPile();
+
+ scoped_ptr<SharedQuadState> top_right_green_shared_quad_state =
+ CreateTestSharedQuadState(green_content_to_target_transform, viewport);
+
+ scoped_ptr<PictureDrawQuad> green_quad1 = PictureDrawQuad::Create();
+ green_quad1->SetNew(top_right_green_shared_quad_state.get(),
+ green_rect1,
+ gfx::Rect(),
+ green_rect1,
+ green_rect1.size(),
+ contents_swizzled,
+ green_rect1,
+ 1.f,
+ green_pile);
+ pass->quad_list.push_back(green_quad1.PassAs<DrawQuad>());
+
+ scoped_ptr<PictureDrawQuad> green_quad2 = PictureDrawQuad::Create();
+ green_quad2->SetNew(top_right_green_shared_quad_state.get(),
+ green_rect2,
+ gfx::Rect(),
+ green_rect2,
+ green_rect2.size(),
+ contents_swizzled,
+ green_rect2,
+ 1.f,
+ green_pile);
+ pass->quad_list.push_back(green_quad2.PassAs<DrawQuad>());
+
+ // Add a green clipped checkerboard in the bottom right to help test
+ // interleaving picture quad content and solid color content.
+ gfx::Rect bottom_right_rect(
+ gfx::Point(viewport.width() / 2, viewport.height() / 2),
+ gfx::Size(viewport.width() / 2, viewport.height() / 2));
+ scoped_ptr<SharedQuadState> bottom_right_green_shared_state =
+ CreateTestSharedQuadStateClipped(
+ green_content_to_target_transform, viewport, bottom_right_rect);
+ scoped_ptr<SolidColorDrawQuad> bottom_right_color_quad =
+ SolidColorDrawQuad::Create();
+ bottom_right_color_quad->SetNew(
+ bottom_right_green_shared_state.get(), viewport, SK_ColorGREEN);
+ pass->quad_list.push_back(bottom_right_color_quad.PassAs<DrawQuad>());
+
+ // Add two blue checkerboards taking up the bottom left and top right,
+ // but use content scales as content rects to make this happen.
+ // The content is at a 4x content scale.
+ gfx::Rect layer_rect(gfx::Size(20, 30));
+ float contents_scale = 4.f;
+ // Two rects that touch at their corners, arbitrarily placed in the layer.
+ gfx::RectF blue_layer_rect1(gfx::PointF(5.5f, 9.0f), gfx::SizeF(2.5f, 2.5f));
+ gfx::RectF blue_layer_rect2(gfx::PointF(8.0f, 6.5f), gfx::SizeF(2.5f, 2.5f));
+ gfx::RectF union_layer_rect = blue_layer_rect1;
+ union_layer_rect.Union(blue_layer_rect2);
+
+ // Because scaling up will cause sampling outside the rects, add one extra
+ // pixel of buffer at the final content scale.
+ float inset = -1.f / contents_scale;
+ blue_layer_rect1.Inset(inset, inset, inset, inset);
+ blue_layer_rect2.Inset(inset, inset, inset, inset);
+
+ scoped_refptr<FakePicturePileImpl> pile =
+ FakePicturePileImpl::CreateFilledPile(pile_tile_size, layer_rect.size());
+ pile->add_draw_rect_with_paint(layer_rect, red_paint);
+ SkPaint transparent_paint;
+ transparent_paint.setXfermodeMode(SkXfermode::kClear_Mode);
+ pile->add_draw_rect_with_paint(union_layer_rect, transparent_paint);
+ SkPaint blue_paint;
+ blue_paint.setColor(SK_ColorBLUE);
+ pile->add_draw_rect_with_paint(blue_layer_rect1, blue_paint);
+ pile->add_draw_rect_with_paint(blue_layer_rect2, blue_paint);
+ pile->RerecordPile();
+
+ gfx::Rect content_rect(
+ gfx::ToEnclosingRect(gfx::ScaleRect(layer_rect, contents_scale)));
+ gfx::Rect content_union_rect(
+ gfx::ToEnclosingRect(gfx::ScaleRect(union_layer_rect, contents_scale)));
+
+ // At a scale of 4x the rectangles with a width of 2.5 will take up 10 pixels,
+ // so scale an additional 10x to make them 100x100.
+ gfx::Transform content_to_target_transform;
+ content_to_target_transform.Scale(10.0, 10.0);
+ gfx::Rect quad_content_rect(gfx::Size(20, 20));
+ scoped_ptr<SharedQuadState> blue_shared_state =
+ CreateTestSharedQuadState(content_to_target_transform, quad_content_rect);
+
+ scoped_ptr<PictureDrawQuad> blue_quad = PictureDrawQuad::Create();
+ blue_quad->SetNew(blue_shared_state.get(),
+ quad_content_rect,
+ gfx::Rect(),
+ quad_content_rect,
+ content_union_rect.size(),
+ contents_swizzled,
+ content_union_rect,
+ contents_scale,
+ pile);
+ pass->quad_list.push_back(blue_quad.PassAs<DrawQuad>());
+
+ // Fill left half of viewport with green.
+ gfx::Transform half_green_content_to_target_transform;
+ gfx::Rect half_green_rect(gfx::Size(viewport.width() / 2, viewport.height()));
+ scoped_ptr<SharedQuadState> half_green_shared_state =
+ CreateTestSharedQuadState(half_green_content_to_target_transform,
+ half_green_rect);
+ scoped_ptr<SolidColorDrawQuad> half_color_quad = SolidColorDrawQuad::Create();
+ half_color_quad->SetNew(
+ half_green_shared_state.get(), half_green_rect, SK_ColorGREEN);
+ pass->quad_list.push_back(half_color_quad.PassAs<DrawQuad>());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ EXPECT_TRUE(this->RunPixelTest(
+ &pass_list,
+ base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
+ ExactPixelComparator(true)));
+}
+
+#endif // !defined(OS_ANDROID)
} // namespace
} // namespace cc
« no previous file with comments | « no previous file | cc/resources/picture_pile_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698