Commit cfe6ac89 authored by Daniele Castagna's avatar Daniele Castagna Committed by Commit Bot

viz: Fix GLRenderer TextureDrawQuad UV calculation

crrev.com/c/2069137 added support for visible_rect.
Unfortunately it incorrectly computed the UV translation.

It had two issues:
- It was using right() and bottom() instead of width() and height()
 when scaling the UV translation part.
- It was not scaling the translation part for the input UV.

This produced incorrect UVs when a rect was not in the
origin and/or the input UV were scaled.

This patch fixes the computation using
cc::MathUtil::ScaleRectProportional instead.

  in viz_unittests.

Bug: 1059408, 1057953
Test: TextureDrawQuadTranslatedAndVisibleRectInsetTopLeftAndCustomUV
Change-Id: Id852f3c43167364a001f33de07892905c7d3b768
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2149637
Commit-Queue: Daniele Castagna <dcastagna@chromium.org>
Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#761038}
parent 71e14d09
......@@ -88,21 +88,14 @@ namespace viz {
namespace {
Float4 UVTransform(const TextureDrawQuad* quad) {
gfx::PointF uv0 = quad->uv_top_left;
gfx::PointF uv1 = quad->uv_bottom_right;
gfx::PointF translation(
quad->visible_rect.origin().x() - quad->rect.origin().x(),
quad->visible_rect.origin().y() - quad->rect.origin().y());
DCHECK(quad->rect.right() && quad->rect.bottom());
translation.Scale(1.f / quad->rect.right(), 1.f / quad->rect.bottom());
gfx::PointF scale(
static_cast<float>(quad->visible_rect.width()) / quad->rect.width(),
static_cast<float>(quad->visible_rect.height()) / quad->rect.height());
Float4 xform = {{translation.x() + uv0.x(), translation.y() + uv0.y(),
(uv1.x() - uv0.x()) * scale.x(),
(uv1.y() - uv0.y()) * scale.y()}};
gfx::RectF uv_rect =
gfx::BoundingRect(quad->uv_top_left, quad->uv_bottom_right);
gfx::RectF visible_uv_rect = cc::MathUtil::ScaleRectProportional(
uv_rect, gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect));
gfx::PointF uv0 = visible_uv_rect.origin();
gfx::PointF uv1 = visible_uv_rect.bottom_right();
Float4 xform = {{uv0.x(), uv0.y(), uv1.x() - uv0.x(), uv1.y() - uv0.y()}};
if (quad->y_flipped) {
xform.data[1] = 1.0f - xform.data[1];
xform.data[3] = -xform.data[3];
......
......@@ -1116,6 +1116,50 @@ TYPED_TEST(RendererPixelTest, TextureDrawQuadVisibleRectInsetTopLeft) {
cc::FuzzyPixelOffByOneComparator(true)));
}
// This tests drawing a TextureDrawQuad with a visible_rect strictly included in
// rect, custom UVs, and rect.origin() that is not in the origin.
TYPED_TEST(RendererPixelTest,
TextureDrawQuadTranslatedAndVisibleRectInsetTopLeftAndCustomUV) {
gfx::Rect rect(this->device_viewport_size_);
int id = 1;
std::unique_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
SharedQuadState* texture_quad_state = CreateTestSharedQuadState(
gfx::Transform(), rect, pass.get(), gfx::RRectF());
CreateTestTwoColoredTextureDrawQuad(
this->use_gpu(), gfx::Rect(this->device_viewport_size_),
SkColorSetARGB(0, 120, 255, 255), // Texel color 1.
SkColorSetARGB(204, 120, 0, 255), // Texel color 2.
SK_ColorGREEN, // Background color.
true, // Premultiplied alpha.
false, // flipped_texture_quad.
false, // Half and half.
texture_quad_state, this->resource_provider_.get(),
this->child_resource_provider_.get(), this->shared_bitmap_manager_.get(),
this->child_context_provider_, pass.get());
auto* quad = static_cast<TextureDrawQuad*>(pass->quad_list.front());
quad->rect.Offset(10, 10);
quad->visible_rect.Offset(10, 10);
quad->visible_rect.Inset(30, 50, 12, 12);
quad->uv_top_left.SetPoint(.2, .3);
quad->uv_bottom_right.SetPoint(.4, .7);
quad->nearest_neighbor = true; // To avoid bilinear filter differences.
SharedQuadState* color_quad_state = CreateTestSharedQuadState(
gfx::Transform(), rect, pass.get(), gfx::RRectF());
auto* color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
color_quad->SetNew(color_quad_state, rect, rect, SK_ColorWHITE, false);
RenderPassList pass_list;
pass_list.push_back(std::move(pass));
EXPECT_TRUE(this->RunPixelTest(
&pass_list,
base::FilePath(FILE_PATH_LITERAL("offset_inset_top_left.png")),
cc::FuzzyPixelOffByOneComparator(true)));
}
TYPED_TEST(RendererPixelTest, TextureDrawQuadVisibleRectInsetBottomRight) {
gfx::Rect rect(this->device_viewport_size_);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment