• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
27 using namespace android::uirenderer;
28 
expectFillEq(Glop::Fill & expectedFill,Glop::Fill & builtFill)29 static 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 
expectBlendEq(Glop::Blend & expectedBlend,Glop::Blend & builtBlend)52 static void expectBlendEq(Glop::Blend& expectedBlend, Glop::Blend& builtBlend) {
53     EXPECT_EQ(expectedBlend.src, builtBlend.src);
54     EXPECT_EQ(expectedBlend.dst, builtBlend.dst);
55 }
56 
expectMeshEq(Glop::Mesh & expectedMesh,Glop::Mesh & builtMesh)57 static 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 
expectTransformEq(Glop::Transform & expectedTransform,Glop::Transform & builtTransform)81 static 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 
expectGlopEq(Glop & expectedGlop,Glop & builtGlop)87 static void expectGlopEq(Glop& expectedGlop, Glop& builtGlop) {
88 #if !HWUI_NEW_OPS
89     EXPECT_EQ(expectedGlop.bounds, builtGlop.bounds);
90 #endif
91     expectBlendEq(expectedGlop.blend, builtGlop.blend);
92     expectFillEq(expectedGlop.fill, builtGlop.fill);
93     expectMeshEq(expectedGlop.mesh, builtGlop.mesh);
94     expectTransformEq(expectedGlop.transform, builtGlop.transform);
95 }
96 
blackUnitQuadGlop(RenderState & renderState)97 static std::unique_ptr<Glop> blackUnitQuadGlop(RenderState& renderState) {
98     std::unique_ptr<Glop> glop(new Glop());
99     glop->blend = { GL_ZERO, GL_ZERO };
100     glop->mesh.elementCount = 4;
101     glop->mesh.primitiveMode = GL_TRIANGLE_STRIP;
102     glop->mesh.indices.indices = nullptr;
103     glop->mesh.indices.bufferObject = GL_ZERO;
104     glop->mesh.vertices = {
105             renderState.meshState().getUnitQuadVBO(),
106             VertexAttribFlags::None,
107             nullptr, nullptr, nullptr,
108             kTextureVertexStride };
109     glop->transform.modelView.loadIdentity();
110     glop->fill.colorEnabled = true;
111     glop->fill.color.set(Color::Black);
112     glop->fill.skiaShaderData.skiaShaderType = kNone_SkiaShaderType;
113     glop->fill.filterMode = ProgramDescription::ColorFilterMode::None;
114     glop->fill.texture = { nullptr, GL_INVALID_ENUM, GL_INVALID_ENUM, GL_INVALID_ENUM, nullptr };
115     return glop;
116 }
117 
RENDERTHREAD_TEST(GlopBuilder,rectSnapTest)118 RENDERTHREAD_TEST(GlopBuilder, rectSnapTest) {
119     RenderState& renderState = renderThread.renderState();
120     Caches& caches = Caches::getInstance();
121     SkPaint paint;
122     Rect dest(1, 1, 100, 100);
123     Matrix4 simpleTranslate;
124     simpleTranslate.loadTranslate(0.7, 0.7, 0);
125     Glop glop;
126     GlopBuilder(renderState, caches, &glop)
127             .setRoundRectClipState(nullptr)
128             .setMeshUnitQuad()
129             .setFillPaint(paint, 1.0f)
130             .setTransform(simpleTranslate, TransformFlags::None)
131             .setModelViewMapUnitToRectSnap(dest)
132             .build();
133 
134     std::unique_ptr<Glop> goldenGlop(blackUnitQuadGlop(renderState));
135     // Rect(1,1,100,100) is the set destination,
136     // so unit quad should be translated by (1,1) and scaled by (99, 99)
137     // Tricky part: because translate (0.7, 0.7) and snapping were set in glopBuilder,
138     // unit quad also should be translate by additional (0.3, 0.3) to snap to exact pixels.
139     goldenGlop->transform.modelView.loadTranslate(1.3, 1.3, 0);
140     goldenGlop->transform.modelView.scale(99, 99, 1);
141 #if !HWUI_NEW_OPS
142     goldenGlop->bounds = android::uirenderer::Rect(1.70, 1.70, 100.70, 100.70);
143 #endif
144     goldenGlop->transform.canvas = simpleTranslate;
145     goldenGlop->fill.texture.filter = GL_NEAREST;
146     expectGlopEq(*goldenGlop, glop);
147 }
148