diff options
author | Kunal <shindek@google.com> | 2020-04-28 15:24:26 -0700 |
---|---|---|
committer | Kunal <shindek@google.com> | 2020-05-07 17:01:17 -0700 |
commit | 38329d1a9fba391312ee7c8e451626828742e84e (patch) | |
tree | 139698bf90e5b8b766f79d287a45a7a997903add | |
parent | 99191b8209e839e4b70b4b2a97394e37d6d7eac7 (diff) | |
download | teeui-38329d1a9fba391312ee7c8e451626828742e84e.tar.gz |
Restructure teeui methods into device class.
Bug: 155226926
Test: N/A
Change-Id: I8dbfde5605e82b8c094db3fb8ceadf88316ee27b
-rw-r--r-- | libteeui/example/Android.bp | 4 | ||||
-rw-r--r-- | libteeui/example/example_utils.cpp | 61 | ||||
-rw-r--r-- | libteeui/example/example_utils.h | 69 | ||||
-rw-r--r-- | libteeui/example/examples.cpp | 29 | ||||
-rw-r--r-- | libteeui/example/layout/common_layout_params.h | 27 | ||||
-rw-r--r-- | libteeui/example/layout/phys_button_layout.h (renamed from libteeui/example/layout.h) | 23 | ||||
-rw-r--r-- | libteeui/example/phys_button_example.cpp | 149 | ||||
-rw-r--r-- | libteeui/example/phys_button_example.h | 31 | ||||
-rw-r--r-- | libteeui/example/teeui.cpp | 188 | ||||
-rw-r--r-- | libteeui/include/teeui/example/example.h (renamed from libteeui/include/teeui/example/teeui.h) | 36 | ||||
-rw-r--r-- | libteeui/include/teeui/utils.h | 3 | ||||
-rw-r--r-- | libteeui_jni/libteeui_jni.cpp | 25 | ||||
-rw-r--r-- | tools/framebufferizer/src/com/android/framebufferizer/utils/FrameBufferBuffer.java | 13 |
13 files changed, 428 insertions, 230 deletions
diff --git a/libteeui/example/Android.bp b/libteeui/example/Android.bp index b2e8a26..5ed3621 100644 --- a/libteeui/example/Android.bp +++ b/libteeui/example/Android.bp @@ -2,8 +2,10 @@ cc_library_static { name: "libteeui_example_layout", defaults: ["keystore_defaults"], srcs: [ + "examples.cpp", + "example_utils.cpp", "fonts.S", - "teeui.cpp", + "phys_button_example.cpp", ], static_libs: [ "libft2.nodep", diff --git a/libteeui/example/example_utils.cpp b/libteeui/example/example_utils.cpp new file mode 100644 index 0000000..b707356 --- /dev/null +++ b/libteeui/example/example_utils.cpp @@ -0,0 +1,61 @@ +/* + * Copyright 2020, 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 <stddef.h> + +#include <teeui/label.h> +#include <teeui/localization/ConfirmationUITranslations.h> + +#include "example_utils.h" + +namespace teeui { +namespace example { + +uint32_t alfaCombineChannel(uint32_t shift, double alfa, uint32_t a, uint32_t b) { + a >>= shift; + a &= 0xff; + b >>= shift; + b &= 0xff; + double acc = alfa * a + (1 - alfa) * b; + if (acc <= 0) return 0; + uint32_t result = acc; + if (result > 255) return 255 << shift; + return result << shift; +} + +Error FrameBuffer::drawPixel(uint32_t x, uint32_t y, uint32_t color) const { + size_t pos = (top_ + y) * lineStride_ + x + left_; + if (pos >= size_in_elements_) { + return Error::OutOfBoundsDrawing; + } + double alfa = (color & 0xff000000) >> 24; + alfa /= 255.0; + auto acc = buffer_[pos]; + buffer_[pos] = alfaCombineChannel(0, alfa, color, acc) | + alfaCombineChannel(8, alfa, color, acc) | + alfaCombineChannel(16, alfa, color, acc); + return Error::OK; +} + +void translate(LabelImpl* label) { + uint64_t textId = label->textId(); + const char* translation = + localization::lookup(static_cast<localization::TranslationId>(textId)); + label->setText({&translation[0], &translation[strlen(translation)]}); +} + +} // namespace example +} // namespace teeui
\ No newline at end of file diff --git a/libteeui/example/example_utils.h b/libteeui/example/example_utils.h new file mode 100644 index 0000000..3a4f841 --- /dev/null +++ b/libteeui/example/example_utils.h @@ -0,0 +1,69 @@ +/* + * + * Copyright 2019, 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. + */ + +#pragma once + +#include <stddef.h> + +#include <teeui/label.h> + +namespace teeui { +namespace example { + +/* + * AOSP color scheme constants. + */ +constexpr static const Color kShieldColor = Color(0xff778500); +constexpr static const Color kShieldColorInv = Color(0xffc4cb80); +constexpr static const Color kTextColor = Color(0xff212121); +constexpr static const Color kTextColorInv = Color(0xffdedede); +constexpr static const Color kBackGroundColor = Color(0xffffffff); +constexpr static const Color kBackGroundColorInv = Color(0xff212121); + +uint32_t alfaCombineChannel(uint32_t shift, double alfa, uint32_t a, uint32_t b); + +template <typename T> uint32_t renderPixel(uint32_t x, uint32_t y, const T& e) { + return e.bounds_.drawPoint(Point<pxs>(x, y)); +} + +struct FrameBuffer { + uint32_t left_; + uint32_t top_; + uint32_t width_; + uint32_t height_; + uint32_t* buffer_; + size_t size_in_elements_; + uint32_t lineStride_; + + Error drawPixel(uint32_t x, uint32_t y, uint32_t color) const; +}; + +template <typename... Elements> +Error drawElements(std::tuple<Elements...>& layout, const PixelDrawer& drawPixel) { + // Error::operator|| is overloaded, so we don't get short circuit evaluation. + // But we get the first error that occurs. We will still try and draw the remaining + // elements in the order they appear in the layout tuple. + return (std::get<Elements>(layout).draw(drawPixel) || ...); +} + +void translate(LabelImpl* label); + +template <typename T, typename Layout> void translateLabel(Layout* layout) { + translate(&std::get<T>(*layout)); +} +} // namespace example +} // namespace teeui
\ No newline at end of file diff --git a/libteeui/example/examples.cpp b/libteeui/example/examples.cpp new file mode 100644 index 0000000..d51a9ff --- /dev/null +++ b/libteeui/example/examples.cpp @@ -0,0 +1,29 @@ +/* + * Copyright 2020, 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 "phys_button_example.h" + +namespace teeui { +namespace example { + +std::unique_ptr<ITeeuiExample> createExample(Examples example) { + switch (example) { + case Examples::PhysButton: + return phys_button::createTeeuiExample(); + } +} +} // namespace example +} // namespace teeui
\ No newline at end of file diff --git a/libteeui/example/layout/common_layout_params.h b/libteeui/example/layout/common_layout_params.h new file mode 100644 index 0000000..9ba2537 --- /dev/null +++ b/libteeui/example/layout/common_layout_params.h @@ -0,0 +1,27 @@ +#pragma once + +#include <teeui/utils.h> + +#include "fonts.h" + +namespace teeui { +namespace example { + +DECLARE_PARAMETER(RightEdgeOfScreen); +DECLARE_PARAMETER(BottomOfScreen); +DECLARE_PARAMETER(DefaultFontSize); // 14_dp regular and 18_dp magnified +DECLARE_PARAMETER(BodyFontSize); // 16_dp regular and 20_dp magnified +DECLARE_TYPED_PARAMETER(ShieldColor, ::teeui::Color); +DECLARE_TYPED_PARAMETER(ColorText, ::teeui::Color); +DECLARE_TYPED_PARAMETER(ColorBG, ::teeui::Color); + +CONSTANT(BorderWidth, 24_dp); + +DECLARE_FONT_BUFFER(RobotoMedium, RobotoMedium, RobotoMedium_length); +DECLARE_FONT_BUFFER(RobotoRegular, RobotoRegular, RobotoRegular_length); +DECLARE_FONT_BUFFER(Shield, Shield, Shield_length); + +CONSTANT(DefaultFont, FONT(RobotoRegular)); + +} // namespace example +} // namespace teeui
\ No newline at end of file diff --git a/libteeui/example/layout.h b/libteeui/example/layout/phys_button_layout.h index 7318a0c..a3f1fe7 100644 --- a/libteeui/example/layout.h +++ b/libteeui/example/layout/phys_button_layout.h @@ -19,31 +19,24 @@ #include <teeui/button.h> #include <teeui/label.h> #include <teeui/localization/ConfirmationUITranslations.h> -#include <teeui/utils.h> -#include "fonts.h" +#include "common_layout_params.h" using teeui::localization::TranslationId; namespace teeui { +namespace example { +namespace phys_button { -DECLARE_PARAMETER(RightEdgeOfScreen); -DECLARE_PARAMETER(BottomOfScreen); DECLARE_PARAMETER(PowerButtonTop); DECLARE_PARAMETER(PowerButtonBottom); DECLARE_PARAMETER(VolUpButtonTop); DECLARE_PARAMETER(VolUpButtonBottom); -DECLARE_PARAMETER(DefaultFontSize); // 14_dp regular and 18_dp magnified -DECLARE_PARAMETER(BodyFontSize); // 16_dp regular and 20_dp magnified -DECLARE_TYPED_PARAMETER(ShieldColor, ::teeui::Color); -DECLARE_TYPED_PARAMETER(ColorText, ::teeui::Color); -DECLARE_TYPED_PARAMETER(ColorBG, ::teeui::Color); NEW_PARAMETER_SET(ConUIParameters, RightEdgeOfScreen, BottomOfScreen, PowerButtonTop, PowerButtonBottom, VolUpButtonTop, VolUpButtonBottom, DefaultFontSize, BodyFontSize, ShieldColor, ColorText, ColorBG); -CONSTANT(BorderWidth, 24_dp); CONSTANT(PowerButtonCenter, (PowerButtonTop() + PowerButtonBottom()) / 2_px); CONSTANT(VolUpButtonCenter, (VolUpButtonTop() + VolUpButtonBottom()) / 2.0_px); CONSTANT(GrayZone, 12_dp); @@ -59,12 +52,6 @@ CONSTANT(ARROW_SHAPE, CONVEX_OBJECT(Vec2d{6.0_dp - SQRT8, 6.0_dp}, Vec2d{6.0_dp, 6.0_dp}, Vec2d{0.0_dp, 12.0_dp}, Vec2d{-SQRT2, 12.0_dp - SQRT2}))); -DECLARE_FONT_BUFFER(RobotoMedium, RobotoMedium, RobotoMedium_length); -DECLARE_FONT_BUFFER(RobotoRegular, RobotoRegular, RobotoRegular_length); -DECLARE_FONT_BUFFER(Shield, Shield, Shield_length); - -CONSTANT(DefaultFont, FONT(RobotoRegular)); - BEGIN_ELEMENT(LabelOK, teeui::Label) FontSize(DefaultFontSize()); LineHeight(20_dp); @@ -166,4 +153,6 @@ END_ELEMENT(); NEW_LAYOUT(ConfUILayout, LabelOK, IconPower, LabelCancel, IconVolUp, IconShield, LabelTitle, LabelHint, LabelBody); -} // namespace teeui +} // namespace phys_button +} // namespace example +} // namespace teeui
\ No newline at end of file diff --git a/libteeui/example/phys_button_example.cpp b/libteeui/example/phys_button_example.cpp new file mode 100644 index 0000000..5f6365e --- /dev/null +++ b/libteeui/example/phys_button_example.cpp @@ -0,0 +1,149 @@ +/* + * Copyright 2020, 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 "phys_button_example.h" + +#include <stddef.h> +#include <stdint.h> + +#include "example_utils.h" +#include "layout/phys_button_layout.h" + +#include <memory> + +namespace teeui { +namespace example { +namespace phys_button { + +template <typename Layout> static void translateLabels(Layout* layout) { + translateLabel<LabelOK>(layout); + translateLabel<LabelCancel>(layout); + translateLabel<LabelTitle>(layout); + translateLabel<LabelHint>(layout); +} + +class GUIStatePhysButtons : public ITeeuiExample { + public: + bool inverted_; + std::string confirmationMessage_; + layout_t<ConfUILayout> layoutInstance_ = {}; + + GUIStatePhysButtons() : inverted_(false), layoutInstance_{} {} + + void selectLanguage(const char* language_id) override { + teeui::localization::selectLangId(language_id); + translateLabels(&layoutInstance_); + } + + void setConfirmationMessage(std::string confirmationMessage) override { + confirmationMessage_ = std::move(confirmationMessage); + std::get<LabelBody>(layoutInstance_) + .setText({&*confirmationMessage_.begin(), &*confirmationMessage_.end()}); + } + + uint32_t setDeviceInfo(DeviceInfo device_info, bool magnified, bool inverted = false) override; + void onEvent(uint32_t, uint32_t, uint32_t) override {} + + uint32_t renderUIIntoBuffer(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t lineStride, + uint32_t* buffer, + size_t buffer_size_in_elements_not_bytes) override; +}; + +std::unique_ptr<ITeeuiExample> createTeeuiExample() { + return std::make_unique<GUIStatePhysButtons>(); +} + +static context<ConUIParameters> setLayoutParams(DeviceInfo& deviceInfo, bool magnified, + bool inverted) { + context<ConUIParameters> ctx(deviceInfo.mm2px_, deviceInfo.dp2px_); + ctx.setParam<RightEdgeOfScreen>(pxs(deviceInfo.width_)); + ctx.setParam<BottomOfScreen>(pxs(deviceInfo.height_)); + ctx.setParam<PowerButtonTop>(mms(deviceInfo.powerButtonTopMm_)); + ctx.setParam<PowerButtonBottom>(mms(deviceInfo.powerButtonBottomMm_)); + ctx.setParam<VolUpButtonTop>(mms(deviceInfo.volUpButtonTopMm_)); + ctx.setParam<VolUpButtonBottom>(mms(deviceInfo.volUpButtonBottomMm_)); + if (magnified) { + ctx.setParam<DefaultFontSize>(18_dp); + ctx.setParam<BodyFontSize>(20_dp); + } else { + ctx.setParam<DefaultFontSize>(14_dp); + ctx.setParam<BodyFontSize>(16_dp); + } + if (inverted) { + ctx.setParam<ShieldColor>(kShieldColorInv); + ctx.setParam<ColorText>(kTextColorInv); + ctx.setParam<ColorBG>(kBackGroundColorInv); + } else { + ctx.setParam<ShieldColor>(kShieldColor); + ctx.setParam<ColorText>(kTextColor); + ctx.setParam<ColorBG>(kBackGroundColor); + } + return ctx; +} + +uint32_t GUIStatePhysButtons::setDeviceInfo(DeviceInfo device_info, bool magnified, bool inverted) { + layoutInstance_ = + instantiateLayout(ConfUILayout(), setLayoutParams(device_info, magnified, inverted)); + inverted_ = inverted; + + return 0; +} + +uint32_t GUIStatePhysButtons::renderUIIntoBuffer(uint32_t x, uint32_t y, uint32_t w, uint32_t h, + uint32_t lineStride, uint32_t* buffer, + size_t buffer_size_in_elements_not_bytes) { + uint32_t afterLastPixelIndex = 0; + if (__builtin_add_overflow(y, h, &afterLastPixelIndex) || + __builtin_add_overflow(afterLastPixelIndex, -1, &afterLastPixelIndex) || + __builtin_mul_overflow(afterLastPixelIndex, lineStride, &afterLastPixelIndex) || + __builtin_add_overflow(afterLastPixelIndex, x, &afterLastPixelIndex) || + __builtin_add_overflow(afterLastPixelIndex, w, &afterLastPixelIndex) || + afterLastPixelIndex > buffer_size_in_elements_not_bytes) { + return uint32_t(Error::OutOfBoundsDrawing); + } + + uint32_t* begin = buffer + (y * lineStride + x); + + Color bgColor = inverted_ ? kBackGroundColorInv : kBackGroundColor; + + for (uint32_t yi = 0; yi < h; ++yi) { + for (uint32_t xi = 0; xi < w; ++xi) { + begin[xi] = bgColor; + } + begin += lineStride; + } + FrameBuffer fb; + fb.left_ = x; + fb.top_ = y; + fb.width_ = w; + fb.height_ = h; + fb.buffer_ = buffer; + fb.size_in_elements_ = buffer_size_in_elements_not_bytes; + fb.lineStride_ = lineStride; + + auto pixelDrawer = makePixelDrawer( + [&fb](uint32_t x, uint32_t y, Color color) -> Error { return fb.drawPixel(x, y, color); }); + + if (auto error = drawElements(layoutInstance_, pixelDrawer)) { + return uint32_t(error.code()); + } + + return 0; // OK +} + +} // namespace phys_button +} // namespace example +} // namespace teeui
\ No newline at end of file diff --git a/libteeui/example/phys_button_example.h b/libteeui/example/phys_button_example.h new file mode 100644 index 0000000..268f2d4 --- /dev/null +++ b/libteeui/example/phys_button_example.h @@ -0,0 +1,31 @@ +/* + * + * Copyright 2019, 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. + */ + +#pragma once + +#include <memory> +#include <teeui/example/example.h> + +namespace teeui { +namespace example { +namespace phys_button { + +std::unique_ptr<ITeeuiExample> createTeeuiExample(); + +} // namespace phys_button +} // namespace example +} // namespace teeui
\ No newline at end of file diff --git a/libteeui/example/teeui.cpp b/libteeui/example/teeui.cpp deleted file mode 100644 index b415283..0000000 --- a/libteeui/example/teeui.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* - * - * Copyright 2019, 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 "layout.h" -#include <cassert> -#include <iostream> -#include <teeui/example/teeui.h> -#include <teeui/localization/ConfirmationUITranslations.h> -#include <typeinfo> - -using namespace teeui; - -static DeviceInfo sDeviceInfo; -static bool sMagnified; -static bool sInverted; -static std::string sConfirmationMessage; - -/* - * AOSP color scheme constants. - */ -constexpr static const Color kShieldColor = Color(0xff778500); -constexpr static const Color kShieldColorInv = Color(0xffc4cb80); -constexpr static const Color kTextColor = Color(0xff212121); -constexpr static const Color kTextColorInv = Color(0xffdedede); -constexpr static const Color kBackGroundColor = Color(0xffffffff); -constexpr static const Color kBackGroundColorInv = Color(0xff212121); - -void setConfirmationMessage(const char* confirmationMessage) { - sConfirmationMessage = confirmationMessage; -} - -uint32_t alfaCombineChannel(uint32_t shift, double alfa, uint32_t a, uint32_t b) { - a >>= shift; - a &= 0xff; - b >>= shift; - b &= 0xff; - double acc = alfa * a + (1 - alfa) * b; - if (acc <= 0) return 0; - uint32_t result = acc; - if (result > 255) return 255 << shift; - return result << shift; -} - -template <typename T> uint32_t renderPixel(uint32_t x, uint32_t y, const T& e) { - return e.bounds_.drawPoint(Point<pxs>(x, y)); -} - -struct FrameBuffer { - uint32_t left_; - uint32_t top_; - uint32_t width_; - uint32_t height_; - uint32_t* buffer_; - size_t size_in_elements_; - uint32_t lineStride_; - - Error drawPixel(uint32_t x, uint32_t y, uint32_t color) const { - size_t pos = (top_ + y) * lineStride_ + x + left_; - if (pos >= size_in_elements_) { - return Error::OutOfBoundsDrawing; - } - double alfa = (color & 0xff000000) >> 24; - alfa /= 255.0; - auto acc = buffer_[pos]; - buffer_[pos] = alfaCombineChannel(0, alfa, color, acc) | - alfaCombineChannel(8, alfa, color, acc) | - alfaCombineChannel(16, alfa, color, acc); - return Error::OK; - } -}; - -template <typename... Elements> -Error drawElements(std::tuple<Elements...>& layout, const PixelDrawer& drawPixel) { - // Error::operator|| is overloaded, so we don't get short circuit evaluation. - // But we get the first error that occurs. We will still try and draw the remaining - // elements in the order they appear in the layout tuple. - return (std::get<Elements>(layout).draw(drawPixel) || ...); -} - -uint32_t setDeviceInfo(DeviceInfo deviceInfo, bool magnified, bool inverted) { - sDeviceInfo = deviceInfo; - sMagnified = magnified; - sInverted = inverted; - return 0; -} - -void selectLanguage(const char* language_id) { - teeui::localization::selectLangId(language_id); -} - -void translate(LabelImpl* label) { - uint64_t textId = label->textId(); - const char* translation = - teeui::localization::lookup(static_cast<teeui::localization::TranslationId>(textId)); - label->setText({&translation[0], &translation[strlen(translation)]}); -} - -template <typename... Elements> void translateLabels(std::tuple<Elements...>& layout) { - translate(&std::get<LabelOK>(layout)); - translate(&std::get<LabelCancel>(layout)); - translate(&std::get<LabelTitle>(layout)); - translate(&std::get<LabelHint>(layout)); -} - -uint32_t renderUIIntoBuffer(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t lineStride, - uint32_t* buffer, size_t buffer_size_in_elements_not_bytes) { - uint32_t afterLastPixelIndex = 0; - if (__builtin_add_overflow(y, h, &afterLastPixelIndex) || - __builtin_add_overflow(afterLastPixelIndex, -1, &afterLastPixelIndex) || - __builtin_mul_overflow(afterLastPixelIndex, lineStride, &afterLastPixelIndex) || - __builtin_add_overflow(afterLastPixelIndex, x, &afterLastPixelIndex) || - __builtin_add_overflow(afterLastPixelIndex, w, &afterLastPixelIndex) || - afterLastPixelIndex > buffer_size_in_elements_not_bytes) { - return uint32_t(Error::OutOfBoundsDrawing); - } - context<ConUIParameters> ctx(sDeviceInfo.mm2px_, sDeviceInfo.dp2px_); - ctx.setParam<RightEdgeOfScreen>(pxs(sDeviceInfo.width_)); - ctx.setParam<BottomOfScreen>(pxs(sDeviceInfo.height_)); - ctx.setParam<PowerButtonTop>(mms(sDeviceInfo.powerButtonTopMm_)); - ctx.setParam<PowerButtonBottom>(mms(sDeviceInfo.powerButtonBottomMm_)); - ctx.setParam<VolUpButtonTop>(mms(sDeviceInfo.volUpButtonTopMm_)); - ctx.setParam<VolUpButtonBottom>(mms(sDeviceInfo.volUpButtonBottomMm_)); - if (sMagnified) { - ctx.setParam<DefaultFontSize>(18_dp); - ctx.setParam<BodyFontSize>(20_dp); - } else { - ctx.setParam<DefaultFontSize>(14_dp); - ctx.setParam<BodyFontSize>(16_dp); - } - - if (sInverted) { - ctx.setParam<ShieldColor>(kShieldColorInv); - ctx.setParam<ColorText>(kTextColorInv); - ctx.setParam<ColorBG>(kBackGroundColorInv); - } else { - ctx.setParam<ShieldColor>(kShieldColor); - ctx.setParam<ColorText>(kTextColor); - ctx.setParam<ColorBG>(kBackGroundColor); - } - - auto layoutInstance = instantiateLayout(ConfUILayout(), ctx); - - translateLabels(layoutInstance); - - uint32_t* begin = buffer + (y * lineStride + x); - - Color bgColor = sInverted ? kBackGroundColorInv : kBackGroundColor; - - for (uint32_t yi = 0; yi < h; ++yi) { - for (uint32_t xi = 0; xi < w; ++xi) { - begin[xi] = bgColor; - } - begin += lineStride; - } - FrameBuffer fb; - fb.left_ = x; - fb.top_ = y; - fb.width_ = w; - fb.height_ = h; - fb.buffer_ = buffer; - fb.size_in_elements_ = buffer_size_in_elements_not_bytes; - fb.lineStride_ = lineStride; - - auto pixelDrawer = makePixelDrawer( - [&fb](uint32_t x, uint32_t y, Color color) -> Error { return fb.drawPixel(x, y, color); }); - - std::get<LabelBody>(layoutInstance) - .setText({&*sConfirmationMessage.begin(), &*sConfirmationMessage.end()}); - - if (auto error = drawElements(layoutInstance, pixelDrawer)) { - return uint32_t(error.code()); - } - - return 0; // OK -} diff --git a/libteeui/include/teeui/example/teeui.h b/libteeui/include/teeui/example/example.h index 3ee37f4..827a72d 100644 --- a/libteeui/include/teeui/example/teeui.h +++ b/libteeui/include/teeui/example/example.h @@ -15,11 +15,13 @@ * limitations under the License. */ -#ifndef TEEUI_LIBTEEUI_INCLUDE_TEEUI_H_ -#define TEEUI_LIBTEEUI_INCLUDE_TEEUI_H_ - #include <stddef.h> -#include <stdint.h> +#include <string> + +#pragma once + +namespace teeui { +namespace example { struct DeviceInfo { uint32_t width_; @@ -32,12 +34,26 @@ struct DeviceInfo { double volUpButtonBottomMm_; }; -uint32_t setDeviceInfo(DeviceInfo device_info, bool magnified, bool inverted = false); -uint32_t renderUIIntoBuffer(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t lineStride, - uint32_t* buffer, size_t buffer_size_in_elements_not_bytes); +class ITeeuiExample { + public: + virtual void selectLanguage(const char*) = 0; + virtual void setConfirmationMessage(std::string) = 0; + virtual uint32_t setDeviceInfo(DeviceInfo, bool, bool) = 0; + virtual uint32_t renderUIIntoBuffer(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t*, + size_t) = 0; + virtual void onEvent(uint32_t x, uint32_t y, uint32_t) = 0; + + virtual ~ITeeuiExample() {} +}; + +enum class Examples : uint32_t { + PhysButton, +}; -void selectLanguage(const char* language_id); +static constexpr const int8_t kFrameBufferError = -1; +static constexpr const int8_t kLayoutExampleError = -2; -void setConfirmationMessage(const char* confirmationMessage); +std::unique_ptr<ITeeuiExample> createExample(Examples example); -#endif // TEEUI_LIBTEEUI_INCLUDE_TEEUI_H_ +} // namespace example +} // namespace teeui diff --git a/libteeui/include/teeui/utils.h b/libteeui/include/teeui/utils.h index 850d1b0..33da519 100644 --- a/libteeui/include/teeui/utils.h +++ b/libteeui/include/teeui/utils.h @@ -259,7 +259,6 @@ template <typename Numeric> struct Div { } }; -template <typename Param, typename Numeric = DefaultNumericType> class context; template <typename T1, typename T2, typename Numeric, template <typename> class Op> struct BinOp; template <typename T1, typename T2, typename Numeric> using add = BinOp<T1, T2, Numeric, Add>; @@ -435,6 +434,8 @@ struct isMetaParam<MetaParam<ParamName, ParamType>> { constexpr static const bool value = true; }; +template <typename Param, typename Numeric = DefaultNumericType> class context; + template <typename... ParamsNames, typename... ParamTypes, typename Numeric> class context<MetaList<MetaParam<ParamsNames, ParamTypes>...>, Numeric> { Numeric mm2px_; diff --git a/libteeui_jni/libteeui_jni.cpp b/libteeui_jni/libteeui_jni.cpp index 960140b..342e8b0 100644 --- a/libteeui_jni/libteeui_jni.cpp +++ b/libteeui_jni/libteeui_jni.cpp @@ -16,7 +16,7 @@ */ #include <jni.h> -#include <teeui/example/teeui.h> +#include <teeui/example/example.h> #include <teeui/localization/ConfirmationUITranslations.h> using teeui::localization::getLanguages; @@ -124,6 +124,8 @@ using JIntArray = JArray<jintArray>; using JByteArray = JArray<jbyteArray>; using JString = JArray<jstring>; +static std::unique_ptr<teeui::example::ITeeuiExample> sCurrentExample; + /* * Class: com_android_framebufferizer_NativeRenderer * Method: setDeviceInfo @@ -131,6 +133,7 @@ using JString = JArray<jstring>; */ extern "C" JNIEXPORT jint JNICALL Java_com_android_framebufferizer_NativeRenderer_setDeviceInfo( JNIEnv* env, jclass, jobject jDeviceInfo, jboolean magnified, jboolean inverted) { + using namespace teeui::example; jclass cDeviceInfo = env->FindClass("Lcom/android/framebufferizer/utils/DeviceInfo;"); jmethodID method = env->GetMethodID(cDeviceInfo, "getWidthPx", "()I"); DeviceInfo device_info; @@ -149,7 +152,8 @@ extern "C" JNIEXPORT jint JNICALL Java_com_android_framebufferizer_NativeRendere device_info.volUpButtonTopMm_ = env->CallDoubleMethod(jDeviceInfo, method); method = env->GetMethodID(cDeviceInfo, "getVolUpButtonBottomMm", "()D"); device_info.volUpButtonBottomMm_ = env->CallDoubleMethod(jDeviceInfo, method); - return setDeviceInfo(device_info, magnified, inverted); + sCurrentExample = createExample(Examples::PhysButton); + return sCurrentExample->setDeviceInfo(device_info, magnified, inverted); } /* @@ -161,9 +165,12 @@ extern "C" JNIEXPORT jint JNICALL Java_com_android_framebufferizer_NativeRendere JNIEnv* env, jclass, jint x, jint y, jint width, jint height, jint lineStride, jintArray jbuffer) { JIntArray buffer(env, jbuffer); - if (!buffer) return 1; - return renderUIIntoBuffer((uint32_t)x, (uint32_t)y, (uint32_t)width, (uint32_t)height, - (uint32_t)lineStride, (uint32_t*)buffer.begin(), buffer.size()); + using namespace teeui::example; + if (!buffer) return kFrameBufferError; + if (!sCurrentExample) return kLayoutExampleError; + return sCurrentExample->renderUIIntoBuffer((uint32_t)x, (uint32_t)y, (uint32_t)width, + (uint32_t)height, (uint32_t)lineStride, + (uint32_t*)buffer.begin(), buffer.size()); } /* * Class: com_android_confirmationui_Translation_selectLangID @@ -172,10 +179,8 @@ extern "C" JNIEXPORT jint JNICALL Java_com_android_framebufferizer_NativeRendere */ extern "C" JNIEXPORT void JNICALL Java_com_android_framebufferizer_NativeRenderer_setLanguage(JNIEnv* env, jclass, jstring jlang_id) { - jboolean isCopy = false; - const char* lang_id = (env)->GetStringUTFChars(jlang_id, &isCopy); - selectLanguage(lang_id); - (env)->ReleaseStringUTFChars(jlang_id, lang_id); + JString lang_id(env, jlang_id); + if (sCurrentExample) sCurrentExample->selectLanguage(lang_id.begin()); } /* * Class: com_android_confirmationui_Translation_selectLangID @@ -206,5 +211,5 @@ extern "C" JNIEXPORT void JNICALL Java_com_android_framebufferizer_NativeRenderer_setConfimationMessage( JNIEnv* env, jclass, jstring jConfirmationMessage) { JString confirmationMessage(env, jConfirmationMessage); - setConfirmationMessage(confirmationMessage.begin()); + if (sCurrentExample) sCurrentExample->setConfirmationMessage(confirmationMessage.begin()); } diff --git a/tools/framebufferizer/src/com/android/framebufferizer/utils/FrameBufferBuffer.java b/tools/framebufferizer/src/com/android/framebufferizer/utils/FrameBufferBuffer.java index e627e47..6953f77 100644 --- a/tools/framebufferizer/src/com/android/framebufferizer/utils/FrameBufferBuffer.java +++ b/tools/framebufferizer/src/com/android/framebufferizer/utils/FrameBufferBuffer.java @@ -332,11 +332,12 @@ public class FrameBufferBuffer extends JPanel implements ComponentListener, Mous } public void renderNativeBuffer() { + final int LAYOUT_EXAMPLE_ERROR = -2; + final int FRAME_BUFFER_ERROR = -1; DeviceInfo deviceInfo = DeviceInfoDB.getDeviceInfo(getConfigSelector().currentDevice()); boolean magnified = getConfigSelector().magnified(); boolean inverted = getConfigSelector().inverted(); - NativeRenderer.setLanguage(getConfigSelector().currentLocale()); - NativeRenderer.setConfimationMessage(getConfigSelector().confirmationMessage()); + int w = deviceInfo.getWidthPx(); int h = deviceInfo.getHeightPx(); final int linestride = w; @@ -352,8 +353,14 @@ public class FrameBufferBuffer extends JPanel implements ComponentListener, Mous ColorModel colorModel = new DirectColorModel(bpp, rMask, gMask, bMask); BufferedImage image = new BufferedImage(colorModel, raster, true, null); NativeRenderer.setDeviceInfo(deviceInfo, magnified, inverted); + NativeRenderer.setLanguage(getConfigSelector().currentLocale()); + NativeRenderer.setConfimationMessage(getConfigSelector().confirmationMessage()); error = NativeRenderer.renderBuffer(0, 0, w, h, linestride, mBuffer.getData()); - if (error != 0) { + if(error == FRAME_BUFFER_ERROR){ + System.out.println("Error framebuffer not initilized " + error); + } else if(error == LAYOUT_EXAMPLE_ERROR){ + System.out.println("Error layout example not initilized " + error); + } else if (error != 0) { System.out.println("Error rendering native buffer " + error); } |