xref: /aosp_15_r20/system/teeui/test/teeui_device_config.cpp (revision 20bfefbe1966c142a35ae1ab84a8af250b3fd403)
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