1*20bfefbeSAndroid Build Coastguard Worker /*
2*20bfefbeSAndroid Build Coastguard Worker * Copyright 2020, The Android Open Source Project
3*20bfefbeSAndroid Build Coastguard Worker *
4*20bfefbeSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*20bfefbeSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*20bfefbeSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*20bfefbeSAndroid Build Coastguard Worker *
8*20bfefbeSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*20bfefbeSAndroid Build Coastguard Worker *
10*20bfefbeSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*20bfefbeSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*20bfefbeSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*20bfefbeSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*20bfefbeSAndroid Build Coastguard Worker * limitations under the License.
15*20bfefbeSAndroid Build Coastguard Worker */
16*20bfefbeSAndroid Build Coastguard Worker
17*20bfefbeSAndroid Build Coastguard Worker #include <fstream>
18*20bfefbeSAndroid Build Coastguard Worker #include <getopt.h>
19*20bfefbeSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*20bfefbeSAndroid Build Coastguard Worker #include <inttypes.h>
21*20bfefbeSAndroid Build Coastguard Worker #include <iostream>
22*20bfefbeSAndroid Build Coastguard Worker #include <stdio.h>
23*20bfefbeSAndroid Build Coastguard Worker #include <stdlib.h>
24*20bfefbeSAndroid Build Coastguard Worker #include <teeui/example/example.h>
25*20bfefbeSAndroid Build Coastguard Worker #include <unistd.h>
26*20bfefbeSAndroid Build Coastguard Worker
27*20bfefbeSAndroid Build Coastguard Worker #include "teeui_device_config.h"
28*20bfefbeSAndroid Build Coastguard Worker #include <teeui/test/teeui_render_test.h>
29*20bfefbeSAndroid Build Coastguard Worker
30*20bfefbeSAndroid Build Coastguard Worker #define TeeuiRenderTest_DO_LOG_DEBUG
31*20bfefbeSAndroid Build Coastguard Worker
32*20bfefbeSAndroid Build Coastguard Worker namespace teeui {
33*20bfefbeSAndroid Build Coastguard Worker
34*20bfefbeSAndroid Build Coastguard Worker namespace test {
35*20bfefbeSAndroid Build Coastguard Worker
36*20bfefbeSAndroid Build Coastguard Worker using namespace example;
37*20bfefbeSAndroid Build Coastguard Worker
initRenderTest(int argc,char ** argv)38*20bfefbeSAndroid Build Coastguard Worker void initRenderTest(int argc, char** argv) {
39*20bfefbeSAndroid Build Coastguard Worker ::teeui::test::TeeuiRenderTest::Instance()->initFromOptions(argc, argv);
40*20bfefbeSAndroid Build Coastguard Worker }
41*20bfefbeSAndroid Build Coastguard Worker
saveToPpm(const uint32_t * data,uint32_t w,uint32_t h,uint32_t linestride)42*20bfefbeSAndroid Build Coastguard Worker void saveToPpm(const uint32_t* data, uint32_t w, uint32_t h, uint32_t linestride) {
43*20bfefbeSAndroid Build Coastguard Worker const testing::TestInfo* const test_info =
44*20bfefbeSAndroid Build Coastguard Worker testing::UnitTest::GetInstance()->current_test_info();
45*20bfefbeSAndroid Build Coastguard Worker std::string testname = test_info->name();
46*20bfefbeSAndroid Build Coastguard Worker std::ofstream out;
47*20bfefbeSAndroid Build Coastguard Worker
48*20bfefbeSAndroid Build Coastguard Worker out.open(testname + ".ppm", std::ios::binary);
49*20bfefbeSAndroid Build Coastguard Worker if (out.is_open()) {
50*20bfefbeSAndroid Build Coastguard Worker uint32_t linestart = 0;
51*20bfefbeSAndroid Build Coastguard Worker
52*20bfefbeSAndroid Build Coastguard Worker /* Write the header */
53*20bfefbeSAndroid Build Coastguard Worker out << "P6\n" << w << " " << h << "\n255\n";
54*20bfefbeSAndroid Build Coastguard Worker
55*20bfefbeSAndroid Build Coastguard Worker /* Write binary Pixel data */
56*20bfefbeSAndroid Build Coastguard Worker for (uint32_t line = 0; line < h; line++) {
57*20bfefbeSAndroid Build Coastguard Worker for (uint32_t col = 0; col < w; col++) {
58*20bfefbeSAndroid Build Coastguard Worker const uint32_t color = data[linestart + col];
59*20bfefbeSAndroid Build Coastguard Worker char rgb[3];
60*20bfefbeSAndroid Build Coastguard Worker
61*20bfefbeSAndroid Build Coastguard Worker rgb[0] = color >> 16;
62*20bfefbeSAndroid Build Coastguard Worker rgb[1] = color >> 8;
63*20bfefbeSAndroid Build Coastguard Worker rgb[2] = color;
64*20bfefbeSAndroid Build Coastguard Worker
65*20bfefbeSAndroid Build Coastguard Worker out.write(rgb, sizeof(rgb));
66*20bfefbeSAndroid Build Coastguard Worker }
67*20bfefbeSAndroid Build Coastguard Worker
68*20bfefbeSAndroid Build Coastguard Worker linestart += linestride;
69*20bfefbeSAndroid Build Coastguard Worker }
70*20bfefbeSAndroid Build Coastguard Worker
71*20bfefbeSAndroid Build Coastguard Worker out.close();
72*20bfefbeSAndroid Build Coastguard Worker }
73*20bfefbeSAndroid Build Coastguard Worker }
74*20bfefbeSAndroid Build Coastguard Worker
runRenderTest(const char * language,bool magnified,bool inverted,const char * confirmationMessage,const char * layout)75*20bfefbeSAndroid Build Coastguard Worker int runRenderTest(const char* language, bool magnified, bool inverted,
76*20bfefbeSAndroid Build Coastguard Worker const char* confirmationMessage, const char* layout) {
77*20bfefbeSAndroid Build Coastguard Worker std::unique_ptr<ITeeuiExample> sCurrentExample = createExample(
78*20bfefbeSAndroid Build Coastguard Worker (strcmp(layout, kTouchButtonLayout) == 0) ? Examples::TouchButton : Examples::PhysButton);
79*20bfefbeSAndroid Build Coastguard Worker
80*20bfefbeSAndroid Build Coastguard Worker DeviceInfo* device_info_ptr = &TeeuiRenderTest::Instance()->device_info;
81*20bfefbeSAndroid Build Coastguard Worker sCurrentExample->setDeviceInfo(*device_info_ptr, magnified, inverted);
82*20bfefbeSAndroid Build Coastguard Worker uint32_t w = device_info_ptr->width_;
83*20bfefbeSAndroid Build Coastguard Worker uint32_t h = device_info_ptr->height_;
84*20bfefbeSAndroid Build Coastguard Worker uint32_t linestride = w;
85*20bfefbeSAndroid Build Coastguard Worker uint32_t buffer_size = h * linestride;
86*20bfefbeSAndroid Build Coastguard Worker std::vector<uint32_t> buffer(buffer_size);
87*20bfefbeSAndroid Build Coastguard Worker sCurrentExample->setConfirmationMessage(confirmationMessage);
88*20bfefbeSAndroid Build Coastguard Worker sCurrentExample->selectLanguage(language);
89*20bfefbeSAndroid Build Coastguard Worker
90*20bfefbeSAndroid Build Coastguard Worker int error =
91*20bfefbeSAndroid Build Coastguard Worker sCurrentExample->renderUIIntoBuffer(0, 0, w, h, linestride, buffer.data(), buffer_size);
92*20bfefbeSAndroid Build Coastguard Worker
93*20bfefbeSAndroid Build Coastguard Worker if (TeeuiRenderTest::Instance()->saveScreen()) {
94*20bfefbeSAndroid Build Coastguard Worker saveToPpm(buffer.data(), w, h, linestride);
95*20bfefbeSAndroid Build Coastguard Worker }
96*20bfefbeSAndroid Build Coastguard Worker
97*20bfefbeSAndroid Build Coastguard Worker return error;
98*20bfefbeSAndroid Build Coastguard Worker }
99*20bfefbeSAndroid Build Coastguard Worker
initFromOptions(int argc,char ** argv)100*20bfefbeSAndroid Build Coastguard Worker void TeeuiRenderTest::initFromOptions(int argc, char** argv) {
101*20bfefbeSAndroid Build Coastguard Worker
102*20bfefbeSAndroid Build Coastguard Worker int option_index = 0;
103*20bfefbeSAndroid Build Coastguard Worker static struct option options[] = {{"width", required_argument, 0, 'w'},
104*20bfefbeSAndroid Build Coastguard Worker {"height", required_argument, 0, 'l'},
105*20bfefbeSAndroid Build Coastguard Worker {"dp2px", required_argument, 0, 'd'},
106*20bfefbeSAndroid Build Coastguard Worker {"mm2px", required_argument, 0, 'm'},
107*20bfefbeSAndroid Build Coastguard Worker {"powerButtonTop", required_argument, 0, 't'},
108*20bfefbeSAndroid Build Coastguard Worker {"powerButtonBottom", required_argument, 0, 'b'},
109*20bfefbeSAndroid Build Coastguard Worker {"volUpButtonTop", required_argument, 0, 'u'},
110*20bfefbeSAndroid Build Coastguard Worker {"volUpButtonBottom", required_argument, 0, 'v'},
111*20bfefbeSAndroid Build Coastguard Worker {"saveScreen", 0, 0, 's'},
112*20bfefbeSAndroid Build Coastguard Worker {"help", 0, 0, 'h'},
113*20bfefbeSAndroid Build Coastguard Worker {"?", 0, 0, '?'},
114*20bfefbeSAndroid Build Coastguard Worker {0, 0, 0, 0}};
115*20bfefbeSAndroid Build Coastguard Worker while (true) {
116*20bfefbeSAndroid Build Coastguard Worker int c = getopt_long(argc, argv, "w:l:d:m:t:b:u:v:h?", options, &option_index);
117*20bfefbeSAndroid Build Coastguard Worker if (c == -1) break;
118*20bfefbeSAndroid Build Coastguard Worker switch (c) {
119*20bfefbeSAndroid Build Coastguard Worker case 'w':
120*20bfefbeSAndroid Build Coastguard Worker device_info.width_ = strtol(optarg, NULL, 10);
121*20bfefbeSAndroid Build Coastguard Worker break;
122*20bfefbeSAndroid Build Coastguard Worker case 'l':
123*20bfefbeSAndroid Build Coastguard Worker device_info.height_ = strtol(optarg, NULL, 10);
124*20bfefbeSAndroid Build Coastguard Worker break;
125*20bfefbeSAndroid Build Coastguard Worker case 'd':
126*20bfefbeSAndroid Build Coastguard Worker device_info.dp2px_ = strtod(optarg, NULL);
127*20bfefbeSAndroid Build Coastguard Worker break;
128*20bfefbeSAndroid Build Coastguard Worker case 'm':
129*20bfefbeSAndroid Build Coastguard Worker device_info.mm2px_ = strtod(optarg, NULL);
130*20bfefbeSAndroid Build Coastguard Worker break;
131*20bfefbeSAndroid Build Coastguard Worker case 't':
132*20bfefbeSAndroid Build Coastguard Worker device_info.powerButtonTopMm_ = strtod(optarg, NULL);
133*20bfefbeSAndroid Build Coastguard Worker break;
134*20bfefbeSAndroid Build Coastguard Worker case 'b':
135*20bfefbeSAndroid Build Coastguard Worker device_info.powerButtonBottomMm_ = strtod(optarg, NULL);
136*20bfefbeSAndroid Build Coastguard Worker break;
137*20bfefbeSAndroid Build Coastguard Worker case 'u':
138*20bfefbeSAndroid Build Coastguard Worker device_info.volUpButtonTopMm_ = strtod(optarg, NULL);
139*20bfefbeSAndroid Build Coastguard Worker break;
140*20bfefbeSAndroid Build Coastguard Worker case 'v':
141*20bfefbeSAndroid Build Coastguard Worker device_info.volUpButtonBottomMm_ = strtod(optarg, NULL);
142*20bfefbeSAndroid Build Coastguard Worker break;
143*20bfefbeSAndroid Build Coastguard Worker case 's':
144*20bfefbeSAndroid Build Coastguard Worker saveScreen_ = true;
145*20bfefbeSAndroid Build Coastguard Worker break;
146*20bfefbeSAndroid Build Coastguard Worker case '?':
147*20bfefbeSAndroid Build Coastguard Worker case 'h':
148*20bfefbeSAndroid Build Coastguard Worker std::cout << "Options:" << std::endl;
149*20bfefbeSAndroid Build Coastguard Worker std::cout << "--width=<device width in pixels>" << std::endl;
150*20bfefbeSAndroid Build Coastguard Worker std::cout << "--height=<device height in pixels>" << std::endl;
151*20bfefbeSAndroid Build Coastguard Worker std::cout << "--dp2px=<pixel per density independent pixel (px/dp) ratio of the "
152*20bfefbeSAndroid Build Coastguard Worker "device. Typically <width in pixels>/412 >"
153*20bfefbeSAndroid Build Coastguard Worker << std::endl;
154*20bfefbeSAndroid Build Coastguard Worker std::cout << "--mm2px=<pixel per millimeter (px/mm) ratio>" << std::endl;
155*20bfefbeSAndroid Build Coastguard Worker std::cout << "--powerButtonTop=<distance from the top of the power button to the top "
156*20bfefbeSAndroid Build Coastguard Worker "of the screen in mm>"
157*20bfefbeSAndroid Build Coastguard Worker << std::endl;
158*20bfefbeSAndroid Build Coastguard Worker std::cout << "--powerButtonBottom=<distance from the bottom of the power button to the "
159*20bfefbeSAndroid Build Coastguard Worker "top of the screen in mm>"
160*20bfefbeSAndroid Build Coastguard Worker << std::endl;
161*20bfefbeSAndroid Build Coastguard Worker std::cout << "--volUpButtonTop=<distance from the top of the UP volume button to the "
162*20bfefbeSAndroid Build Coastguard Worker "top of the screen in mm>"
163*20bfefbeSAndroid Build Coastguard Worker << std::endl;
164*20bfefbeSAndroid Build Coastguard Worker std::cout << "--volUpButtonBottom=<distance from the bottom of the UP power button to "
165*20bfefbeSAndroid Build Coastguard Worker "the top of the screen in mm>"
166*20bfefbeSAndroid Build Coastguard Worker << std::endl;
167*20bfefbeSAndroid Build Coastguard Worker std::cout << "--saveScreen - save rendered screen to ppm files in working directory"
168*20bfefbeSAndroid Build Coastguard Worker << std::endl;
169*20bfefbeSAndroid Build Coastguard Worker exit(0);
170*20bfefbeSAndroid Build Coastguard Worker }
171*20bfefbeSAndroid Build Coastguard Worker }
172*20bfefbeSAndroid Build Coastguard Worker }
173*20bfefbeSAndroid Build Coastguard Worker
174*20bfefbeSAndroid Build Coastguard Worker } // namespace test
175*20bfefbeSAndroid Build Coastguard Worker
176*20bfefbeSAndroid Build Coastguard Worker } // namespace teeui
177