GlopBuilderTests.cpp revision 5e00c7ce063116c11315639f0035aca8ad73e8cc
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18
19#include "Glop.h"
20#include "GlopBuilder.h"
21#include "Rect.h"
22#include "tests/common/TestUtils.h"
23#include "utils/Color.h"
24
25#include <SkPaint.h>
26
27using namespace android::uirenderer;
28
29static void expectFillEq(Glop::Fill& expectedFill, Glop::Fill& builtFill) {
30    EXPECT_EQ(expectedFill.colorEnabled, builtFill.colorEnabled);
31    if (expectedFill.colorEnabled)
32        EXPECT_EQ(expectedFill.color, builtFill.color);
33
34    EXPECT_EQ(expectedFill.filterMode, builtFill.filterMode);
35    if (expectedFill.filterMode == ProgramDescription::ColorFilterMode::Blend) {
36        EXPECT_EQ(expectedFill.filter.color, builtFill.filter.color);
37    } else if (expectedFill.filterMode == ProgramDescription::ColorFilterMode::Matrix) {
38        Glop::Fill::Filter::Matrix& expectedMatrix = expectedFill.filter.matrix;
39        Glop::Fill::Filter::Matrix& builtMatrix = expectedFill.filter.matrix;
40        EXPECT_TRUE(std::memcmp(expectedMatrix.matrix, builtMatrix.matrix,
41                sizeof(Glop::Fill::Filter::Matrix::matrix)));
42        EXPECT_TRUE(std::memcmp(expectedMatrix.vector, builtMatrix.vector,
43                sizeof(Glop::Fill::Filter::Matrix::vector)));
44    }
45    EXPECT_EQ(expectedFill.skiaShaderData.skiaShaderType, builtFill.skiaShaderData.skiaShaderType);
46    EXPECT_EQ(expectedFill.texture.clamp, builtFill.texture.clamp);
47    EXPECT_EQ(expectedFill.texture.filter, builtFill.texture.filter);
48    EXPECT_EQ(expectedFill.texture.target, builtFill.texture.target);
49    EXPECT_EQ(expectedFill.texture.textureTransform, builtFill.texture.textureTransform);
50}
51
52static void expectBlendEq(Glop::Blend& expectedBlend, Glop::Blend& builtBlend) {
53    EXPECT_EQ(expectedBlend.src, builtBlend.src);
54    EXPECT_EQ(expectedBlend.dst, builtBlend.dst);
55}
56
57static void expectMeshEq(Glop::Mesh& expectedMesh, Glop::Mesh& builtMesh) {
58    EXPECT_EQ(expectedMesh.elementCount, builtMesh.elementCount);
59    EXPECT_EQ(expectedMesh.primitiveMode, builtMesh.primitiveMode);
60    EXPECT_EQ(expectedMesh.indices.indices, builtMesh.indices.indices);
61    EXPECT_EQ(expectedMesh.indices.bufferObject, builtMesh.indices.bufferObject);
62    EXPECT_EQ(expectedMesh.vertices.attribFlags, builtMesh.vertices.attribFlags);
63    EXPECT_EQ(expectedMesh.vertices.bufferObject, builtMesh.vertices.bufferObject);
64    EXPECT_EQ(expectedMesh.vertices.color, builtMesh.vertices.color);
65    EXPECT_EQ(expectedMesh.vertices.position, builtMesh.vertices.position);
66    EXPECT_EQ(expectedMesh.vertices.stride, builtMesh.vertices.stride);
67    EXPECT_EQ(expectedMesh.vertices.texCoord, builtMesh.vertices.texCoord);
68
69    if (builtMesh.vertices.position) {
70        for (int i = 0; i < 4; i++) {
71            TextureVertex& expectedVertex = expectedMesh.mappedVertices[i];
72            TextureVertex& builtVertex = builtMesh.mappedVertices[i];
73            EXPECT_EQ(expectedVertex.u, builtVertex.u);
74            EXPECT_EQ(expectedVertex.v, builtVertex.v);
75            EXPECT_EQ(expectedVertex.x, builtVertex.x);
76            EXPECT_EQ(expectedVertex.y, builtVertex.y);
77        }
78    }
79}
80
81static void expectTransformEq(Glop::Transform& expectedTransform, Glop::Transform& builtTransform) {
82    EXPECT_EQ(expectedTransform.canvas, builtTransform.canvas);
83    EXPECT_EQ(expectedTransform.modelView, builtTransform.modelView);
84    EXPECT_EQ(expectedTransform.transformFlags, expectedTransform.transformFlags);
85}
86
87static void expectGlopEq(Glop& expectedGlop, Glop& builtGlop) {
88    expectBlendEq(expectedGlop.blend, builtGlop.blend);
89    expectFillEq(expectedGlop.fill, builtGlop.fill);
90    expectMeshEq(expectedGlop.mesh, builtGlop.mesh);
91    expectTransformEq(expectedGlop.transform, builtGlop.transform);
92}
93
94static std::unique_ptr<Glop> blackUnitQuadGlop(RenderState& renderState) {
95    std::unique_ptr<Glop> glop(new Glop());
96    glop->blend = { GL_ZERO, GL_ZERO };
97    glop->mesh.elementCount = 4;
98    glop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
99    glop->mesh.indices.indices = nullptr;
100    glop->mesh.indices.bufferObject = GL_ZERO;
101    glop->mesh.vertices = {
102            renderState.meshState().getUnitQuadVBO(),
103            VertexAttribFlags::None,
104            nullptr, nullptr, nullptr,
105            kTextureVertexStride };
106    glop->transform.modelView.loadIdentity();
107    glop->fill.colorEnabled = true;
108    glop->fill.color.set(Color::Black);
109    glop->fill.skiaShaderData.skiaShaderType = kNone_SkiaShaderType;
110    glop->fill.filterMode = ProgramDescription::ColorFilterMode::None;
111    glop->fill.texture = { nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr };
112    return glop;
113}
114
115RENDERTHREAD_TEST(GlopBuilder, rectSnapTest) {
116    RenderState& renderState = renderThread.renderState();
117    Caches& caches = Caches::getInstance();
118    SkPaint paint;
119    Rect dest(1, 1, 100, 100);
120    Matrix4 simpleTranslate;
121    simpleTranslate.loadTranslate(0.7, 0.7, 0);
122    Glop glop;
123    GlopBuilder(renderState, caches, &glop)
124            .setRoundRectClipState(nullptr)
125            .setMeshUnitQuad()
126            .setFillPaint(paint, 1.0f)
127            .setTransform(simpleTranslate, TransformFlags::None)
128            .setModelViewMapUnitToRectSnap(dest)
129            .build();
130
131    std::unique_ptr<Glop> goldenGlop(blackUnitQuadGlop(renderState));
132    // Rect(1,1,100,100) is the set destination,
133    // so unit quad should be translated by (1,1) and scaled by (99, 99)
134    // Tricky part: because translate (0.7, 0.7) and snapping were set in glopBuilder,
135    // unit quad also should be translate by additional (0.3, 0.3) to snap to exact pixels.
136    goldenGlop->transform.modelView.loadTranslate(1.3, 1.3, 0);
137    goldenGlop->transform.modelView.scale(99, 99, 1);
138    goldenGlop->transform.canvas = simpleTranslate;
139    goldenGlop->fill.texture.filter = GL_NEAREST;
140    expectGlopEq(*goldenGlop, glop);
141}
142