diff options
Diffstat (limited to 'host/libs/confui/host_renderer.cc')
-rw-r--r-- | host/libs/confui/host_renderer.cc | 245 |
1 files changed, 0 insertions, 245 deletions
diff --git a/host/libs/confui/host_renderer.cc b/host/libs/confui/host_renderer.cc deleted file mode 100644 index f3e0c5272..000000000 --- a/host/libs/confui/host_renderer.cc +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "host/libs/confui/host_renderer.h" - -namespace cuttlefish { -namespace confui { -static teeui::Color alfaCombineChannel(std::uint32_t shift, double alfa, - teeui::Color a, teeui::Color b) { - a >>= shift; - a &= 0xff; - b >>= shift; - b &= 0xff; - double acc = alfa * a + (1 - alfa) * b; - if (acc <= 0) return 0; - std::uint32_t result = acc; - if (result > 255) return 255 << shift; - return result << shift; -} - -ConfUiRenderer::ConfUiRenderer(const std::uint32_t display) - : display_num_(display), - lang_id_{"en"}, - prompt_("Am I Yumi Meow?"), - current_height_(ScreenConnectorInfo::ScreenHeight(display_num_)), - current_width_(ScreenConnectorInfo::ScreenWidth(display_num_)), - color_bg_{kColorBackground}, - color_text_{kColorDisabled}, - shield_color_{kColorShield}, - is_inverted_{false}, - ctx_{GetDeviceContext()} { - auto opted_frame = RepaintRawFrame(prompt_, lang_id_); - if (opted_frame) { - raw_frame_ = std::move(opted_frame.value()); - } -} - -void ConfUiRenderer::SetConfUiMessage(const std::string& msg) { - prompt_ = msg; - SetText<LabelConfMsg>(msg); -} - -teeui::Error ConfUiRenderer::SetLangId(const std::string& lang_id) { - using teeui::Error; - lang_id_ = lang_id; - teeui::localization::selectLangId(lang_id_.c_str()); - if (auto error = UpdateTranslations()) { - return error; - } - return Error::OK; -} - -teeui::Error ConfUiRenderer::UpdateTranslations() { - using namespace teeui; - if (auto error = UpdateString<LabelOK>()) { - return error; - } - if (auto error = UpdateString<LabelOK>()) { - return error; - } - if (auto error = UpdateString<LabelCancel>()) { - return error; - } - if (auto error = UpdateString<LabelTitle>()) { - return error; - } - if (auto error = UpdateString<LabelHint>()) { - return error; - } - return Error::OK; -} - -teeui::context<teeui::ConUIParameters> ConfUiRenderer::GetDeviceContext() { - using namespace teeui; - const unsigned long long w = ScreenConnectorInfo::ScreenWidth(display_num_); - const unsigned long long h = ScreenConnectorInfo::ScreenHeight(display_num_); - const auto screen_width = operator""_px(w); - const auto screen_height = operator""_px(h); - context<teeui::ConUIParameters> ctx(6.45211, 400.0 / 412.0); - ctx.setParam<RightEdgeOfScreen>(screen_width); - ctx.setParam<BottomOfScreen>(screen_height); - ctx.setParam<PowerButtonTop>(20.26_mm); - ctx.setParam<PowerButtonBottom>(30.26_mm); - ctx.setParam<VolUpButtonTop>(40.26_mm); - ctx.setParam<VolUpButtonBottom>(50.26_mm); - ctx.setParam<DefaultFontSize>(14_dp); - ctx.setParam<BodyFontSize>(16_dp); - return ctx; -} - -bool ConfUiRenderer::InitLayout(const std::string& lang_id) { - layout_ = teeui::instantiateLayout(teeui::ConfUILayout(), ctx_); - SetLangId(lang_id); - if (auto error = UpdateTranslations()) { - ConfUiLog(ERROR) << "Update Translation Error"; - return false; - } - UpdateColorScheme(&ctx_); - return true; -} - -teeui::Error ConfUiRenderer::UpdatePixels(TeeUiFrame& raw_frame, - std::uint32_t x, std::uint32_t y, - teeui::Color color) { - auto buffer = raw_frame.data(); - const auto height = ScreenConnectorInfo::ScreenHeight(display_num_); - const auto width = ScreenConnectorInfo::ScreenWidth(display_num_); - auto pos = width * y + x; - if (pos >= (height * width)) { - ConfUiLog(ERROR) << "Rendering Out of Bound"; - return teeui::Error::OutOfBoundsDrawing; - } - const double alfa = ((color & 0xff000000) >> 24) / 255.0; - auto& pixel = *reinterpret_cast<teeui::Color*>(buffer + pos); - pixel = alfaCombineChannel(0, alfa, color, pixel) | - alfaCombineChannel(8, alfa, color, pixel) | - alfaCombineChannel(16, alfa, color, pixel); - return teeui::Error::OK; -} - -std::tuple<TeeUiFrame&, bool> ConfUiRenderer::RenderRawFrame( - const std::string& confirmation_msg, const std::string& lang_id) { - /* we repaint only if one or more of the followng meet: - * - * 1. raw_frame_ is empty - * 2. the current_width_ and current_height_ is out of date - * 3. lang_id is different (e.g. new locale) - * - * in the future, maybe you wanna inverted, new background, etc? - */ - if (lang_id != lang_id_ || !IsFrameReady() || - current_height_ != ScreenConnectorInfo::ScreenHeight(display_num_) || - current_width_ != ScreenConnectorInfo::ScreenWidth(display_num_)) { - auto opted_new_frame = RepaintRawFrame(confirmation_msg, lang_id_); - if (opted_new_frame) { - // repainting from the scratch successful in a new frame - raw_frame_ = std::move(opted_new_frame.value()); - return {raw_frame_, true}; - } - // repaint failed even if it was necessary, so returns invalid values - raw_frame_.clear(); - return {raw_frame_, false}; - } - // no need to repaint from the scratch. repaint the confirmation message only - // the frame is mostly already in raw_frame_ - auto ret_code = RenderConfirmationMsgOnly(confirmation_msg); - return {raw_frame_, (ret_code == teeui::Error::OK)}; -} - -std::optional<TeeUiFrame> ConfUiRenderer::RepaintRawFrame( - const std::string& confirmation_msg, const std::string& lang_id) { - /* - * NOTE: DON'T use current_width_/height_ to create this frame - * it may fail, and then we must not mess up the current_width_, height_ - * - */ - if (!InitLayout(lang_id)) { - return std::nullopt; - } - SetConfUiMessage(confirmation_msg); - auto color = kColorEnabled; - std::get<teeui::LabelOK>(layout_).setTextColor(color); - std::get<teeui::LabelCancel>(layout_).setTextColor(color); - - /* in the future, if ever we need to register a handler for the - Label{OK,Cancel}. do this: std::get<teeui::LabelOK>(layout_) - .setCB(teeui::makeCallback<teeui::Error, teeui::Event>( - [](teeui::Event e, void* p) -> teeui::Error { - LOG(DEBUG) << "Calling callback for Confirm?"; - return reinterpret_cast<decltype(owner)*>(p)->TapOk(e); }, - owner)); - */ - // we manually check if click happened, where if yes, and generate the label - // event manually. So we won't register the handler here. - /** - * should be uint32_t for teeui APIs. - * It assumes that each raw frame buffer element is 4 bytes - */ - TeeUiFrame new_raw_frame( - ScreenConnectorInfo::ScreenSizeInBytes(display_num_) / 4, - kColorBackground); - - auto draw_pixel = teeui::makePixelDrawer( - [this, &new_raw_frame](std::uint32_t x, std::uint32_t y, - teeui::Color color) -> teeui::Error { - return this->UpdatePixels(new_raw_frame, x, y, color); - }); - - // render all components - const auto error = drawElements(layout_, draw_pixel); - if (error) { - ConfUiLog(ERROR) << "Painting failed: " << error.code(); - return std::nullopt; - } - - // set current frame's dimension as frame generation was successful - current_height_ = ScreenConnectorInfo::ScreenHeight(display_num_); - current_width_ = ScreenConnectorInfo::ScreenWidth(display_num_); - - return {new_raw_frame}; -} - -teeui::Error ConfUiRenderer::RenderConfirmationMsgOnly( - const std::string& confirmation_msg) { - // repaint labelbody on the raw_frame__ only - auto callback_func = [this](std::uint32_t x, std::uint32_t y, - teeui::Color color) -> teeui::Error { - return UpdatePixels(raw_frame_, x, y, color); - }; - auto draw_pixel = teeui::makePixelDrawer(callback_func); - LabelConfMsg& label = std::get<LabelConfMsg>(layout_); - auto b = GetBoundary(label); - for (std::uint32_t i = 0; i != b.w; i++) { - const auto col_index = i + b.x - 1; - for (std::uint32_t j = 0; j != b.y; j++) { - const auto row_index = (j + b.y - 1); - raw_frame_[current_width_ * row_index + col_index] = color_bg_; - } - } - - SetConfUiMessage(confirmation_msg); - ConfUiLog(DEBUG) << "Repaint Confirmation Msg with :" << prompt_; - if (auto error = std::get<LabelConfMsg>(layout_).draw(draw_pixel)) { - ConfUiLog(ERROR) << "Repainting Confirmation Message Label failed:" - << error.code(); - return error; - } - return teeui::Error::OK; -} - -} // end of namespace confui -} // end of namespace cuttlefish |