Skip to content

Commit

Permalink
chore(color): Libopenui refactor (#3614)
Browse files Browse the repository at this point in the history
* Refactor object creation logic.
Remove unused LVGL features.

* Remove unused files.
Fix height for widgets.

* Rename 'OpenTxTheme' class to 'EdgeTxTheme'.
Cleanup commented out code.
Cleanup unused code from 'etx_lv_theme.cpp'.

* More cleanup.

* Move more style code to etx_lv_theme.cpp

* Update license

* Make default button height match other controls.

* Fix curve edit layout.

* Fix layouts.

* FormWindow and FormGroup provided identical functionality - rename FormGroup to FormWindow and remove duplicate.

* Simplify menu icon handling.
Remove unused 'flysky.cpp' file.

* Fix window size change.

* Simplify page header code.
Fix statistics view page.

* Remove unused file.
Replace redundant 'Subtitle' class with a macro.
Fix compiler warnings.

* Fix compiler warning in LvglWrapper.cpp.
Remove unused code in static.h.
Simplify about page.

* Rename ICON_OPENTX to ICON_EDGETX.

* Fix github build error.

* Fix github build error (attempt 2).

* Move ButtonMatrix styling to etx_lv_theme.cpp.

* Scroll bar consistency.

* Use styles for ButtonMatrix text color.

* Use 'active' color for selected USB advanced setup buttons. Move error message to bottom of page.

* Create style for popup window title bar.
Simplify advanced USB setup code.
Remove unused libopenui/carousel.* files.

* Add style for modal popup content.

* Remove unused BUTTON_BACKGROUND flag.

* Replace GridLayout with FormWindow. Remove unused gridlayout.h file.

* Fix rebase.

* Merge ChoiceEx class into Choice class code.
Remove unused CurveKeyboard.

* Use LVGL bar for progress indicator.
Update only style colors when theme changes (don't recreate all style settings).

* Move ProgressDialog class to dlalog.h/dialog.cpp files.

* Simplify trim and slider code in main view.
Simplify the hardware inputs code.
Fix dialog size.
Remove unused code in layout factory.

* Cleanup unused code.

* Add style for FormWindow class.
Merge BaseNumberEdit class into NumberEdit class and remove BaseNumberEdit.
Remove more unused files.
Cleanup libopenui_config.h files.

* Re-organise libopenui include files to fix build error.

* Fix build error.

* Add missed styles to etx_lv_theme.cpp.
Delete commented out #includes.
More cleaning up of libopenui_xxx.h files and dependencies.
Re-enable LVGL CHECKBOX feature.

* Merge libopenui_helpers.h into opentx_helpers.h file.

* Fix firmware build.

* Use object constructors for LVGL object creation as suggested by gagarinlg.
Add style for number edit text alignment.
Fix background color for focussed control.

* Move color related stuff from libopenui_defines.h to colors.h.
Remove need for libopenui_depends.h file.

* Merge libopenui_types.h content into opentx_types.h file.

* Rename CheckBox class to ToggleSwitch.

* Restore code to update flight mode text color when theme changes.

* Cleanup some more unused code.

* Remove redundant theme.h file.

* Fix rebase.

* Fix button matrix style.

* Fix rebase

* Fix rebase

* Ensure correct initialisation of Choice object.

* Fix rebase.

* Make the slider control bigger to make touch activation easier.

* Fix build error.

* Fix slider logic and cleanup code.

* Use ACTIVE theme color for inputs, mixes, LS, GV and SF.

* Improved border width consistency and focussed state consistency.

* Remove duplicate copy of the default theme colors.
  • Loading branch information
philmoz authored Aug 4, 2023
1 parent c0df9e9 commit 69338ab
Show file tree
Hide file tree
Showing 231 changed files with 2,143 additions and 5,886 deletions.
2 changes: 2 additions & 0 deletions radio/src/audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,8 @@ void audioTask(void * pdata);
#define AUDIO_ERROR_MESSAGE(e) audioEvent(e)
#define AUDIO_TIMER_MINUTE(t) playDuration(t, 0, 0)

void onKeyError();

void audioKeyPress();
void audioKeyError();
void audioTrimPress(int value);
Expand Down
2 changes: 1 addition & 1 deletion radio/src/datastructs_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -834,7 +834,7 @@ PACK(struct TrainerData {
#define THEME_NAME_LEN 8
#define THEME_DATA \
NOBACKUP(char themeName[THEME_NAME_LEN]); \
NOBACKUP(OpenTxTheme::PersistentData themeData);
NOBACKUP(EdgeTxTheme::PersistentData themeData);
#else
#define THEME_DATA
#endif
Expand Down
4 changes: 0 additions & 4 deletions radio/src/gui/128x64/lcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@
#include "opentx_types.h"
#include "board.h"

typedef uint32_t LcdFlags;
typedef uint8_t pixel_t;
typedef int coord_t;

#define BOX_WIDTH 23
#define CENTER
#define CENTER_OFS 0
Expand Down
4 changes: 0 additions & 4 deletions radio/src/gui/212x64/lcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@
#include "opentx_types.h"
#include "board.h"

typedef uint32_t LcdFlags;
typedef uint8_t pixel_t;
typedef int coord_t;

#define BOX_WIDTH 31
#define CENTER "\015"
#define CENTER_OFS (7*FW-FW/2)
Expand Down
6 changes: 0 additions & 6 deletions radio/src/gui/colorlcd/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -216,12 +216,6 @@ add_gui_src(input_mix_button.cpp)
add_gui_src(channel_bar.cpp)

add_gui_src(list_line_button.cpp)
add_gui_src(lvgl_widgets/input_mix_line.c)
add_gui_src(lvgl_widgets/input_mix_group.c)

if(HARDWARE_TOUCH)
add_gui_src(keyboard_curve.cpp)
endif()

if(USBJ_EX)
add_gui_src(model_usbjoystick.cpp)
Expand Down
5 changes: 1 addition & 4 deletions radio/src/gui/colorlcd/LvglWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

#include "LvglWrapper.h"
#include "themes/etx_lv_theme.h"
#include "widgets/field_edit.h"

#include "view_main.h"

Expand Down Expand Up @@ -277,12 +276,10 @@ static void rotaryDriverRead(lv_indev_drv_t *drv, lv_indev_data_t *data)
}
}

// libopenui_depends.h
int8_t rotaryEncoderGetAccel() { return _rotary_enc_accel; }

#else // !defined(ROTARY_ENCODER_NAVIGATION)

// libopenui_depends.h
int8_t rotaryEncoderGetAccel() { return 0; }

#endif // defined(ROTARY_ENCODER_NAVIGATION)
Expand Down Expand Up @@ -342,7 +339,7 @@ void initLvglTheme()
/* Initialize the ETX theme */
lv_theme_t* th = etx_lv_theme_init(
NULL, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED),
false, LV_FONT_DEFAULT);
LV_FONT_DEFAULT);

/* Assign the theme to the current display*/
lv_disp_set_theme(NULL, th);
Expand Down
3 changes: 3 additions & 0 deletions radio/src/gui/colorlcd/LvglWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,7 @@ class LvglWrapper
static void runNested();
};

// multiplication factor between 0 and 25
int8_t rotaryEncoderGetAccel();

#endif // _LVGLWRAPPER_H_
14 changes: 7 additions & 7 deletions radio/src/gui/colorlcd/access_settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ RegisterDialog::RegisterDialog(Window* parent, uint8_t moduleIdx) :
// new StaticText(line, rect_t{}, STR_STATUS, 0, COLOR_THEME_PRIMARY1);
// status = new StaticText(line, rect_t{}, STR_WAITING_FOR_RX, 0, COLOR_THEME_PRIMARY1);

auto box = new FormGroup(form, rect_t{});
auto box = new FormWindow(form, rect_t{});
box->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8));
lv_obj_set_style_flex_main_place(box->getLvObj(), LV_FLEX_ALIGN_SPACE_EVENLY, 0);
box->padAll(lv_dpx(8));
Expand Down Expand Up @@ -522,7 +522,7 @@ void ModuleOptions::update()

line = form->newLine(&grid);
new StaticText(line, rect_t{}, STR_EXT_ANTENNA, 0, COLOR_THEME_PRIMARY1);
new CheckBox(line, rect_t{},
new ToggleSwitch(line, rect_t{},
[]() {
const auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
return hwSettings.moduleSettings.externalAntenna;
Expand Down Expand Up @@ -581,7 +581,7 @@ void ModuleOptions::update()

line = form->newLine(&grid);

auto box = new FormGroup(form, rect_t{});
auto box = new FormWindow(form, rect_t{});
box->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8));
lv_obj_set_style_flex_main_place(box->getLvObj(), LV_FLEX_ALIGN_SPACE_EVENLY, 0);
box->padAll(lv_dpx(8));
Expand Down Expand Up @@ -750,7 +750,7 @@ void RxOptions::update()
// PWM rate
line = form->newLine(&grid);
new StaticText(line, rect_t{}, isModuleR9MAccess(moduleIdx) ? "6.67ms PWM" : "7ms PWM");
new CheckBox(
new ToggleSwitch(
line, rect_t{},
[]() {
auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
Expand All @@ -764,7 +764,7 @@ void RxOptions::update()
// telemetry disabled
line = form->newLine(&grid);
new StaticText(line, rect_t{}, STR_TELEMETRY_DISABLED);
auto tele25mw = new CheckBox(
auto tele25mw = new ToggleSwitch(
line, rect_t{},
[]() {
auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
Expand All @@ -785,7 +785,7 @@ void RxOptions::update()
// telemetry 25 mW
line = form->newLine(&grid);
new StaticText(line, rect_t{}, "25mw Tele");
new CheckBox(
new ToggleSwitch(
line, rect_t{},
[]() {
auto& hwSettings = getPXX2HardwareAndSettingsBuffer();
Expand Down Expand Up @@ -875,7 +875,7 @@ void RxOptions::update()
line = form->newLine(&grid);
new DynamicText(line, rect_t{}, [=]() { return statusText; });

auto box = new FormGroup(form, rect_t{});
auto box = new FormWindow(form, rect_t{});
box->setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, lv_dpx(8));
lv_obj_set_style_flex_main_place(box->getLvObj(), LV_FLEX_ALIGN_SPACE_EVENLY, 0);
box->padAll(lv_dpx(8));
Expand Down
12 changes: 5 additions & 7 deletions radio/src/gui/colorlcd/afhds3_options.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@
#include "afhds3_options.h"
#include "opentx.h"

//#include "checkbox.h"

static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1),
LV_GRID_TEMPLATE_LAST};
static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT,
Expand Down Expand Up @@ -75,7 +73,7 @@ static void pwmfreq_changedV0(lv_event_t* e)
}
}
PWMfrequencyChoice::PWMfrequencyChoice(Window* parent, uint8_t moduleIdx, uint8_t channelIdx) :
FormGroup(parent, rect_t{})
FormWindow(parent, rect_t{})
{
setFlexLayout(LV_FLEX_FLOW_ROW);
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
Expand Down Expand Up @@ -112,7 +110,7 @@ PWMfrequencyChoice::PWMfrequencyChoice(Window* parent, uint8_t moduleIdx, uint8_
}

PWMfrequencyChoice::PWMfrequencyChoice(Window* parent, uint8_t moduleIdx ) :
FormGroup(parent, rect_t{})
FormWindow(parent, rect_t{})
{
setFlexLayout(LV_FLEX_FLOW_ROW);
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
Expand Down Expand Up @@ -163,7 +161,7 @@ AFHDS3_Options::AFHDS3_Options(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
title += ")";
header.setTitle2(title);

auto form = new FormGroup(&body, rect_t{});
auto form = new FormWindow(&body, rect_t{});
form->setFlexLayout();
form->padAll(lv_dpx(8));

Expand All @@ -183,7 +181,7 @@ AFHDS3_Options::AFHDS3_Options(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
temp_str += " ";
temp_str += STR_SYNC;
new StaticText(line, rect_t{}, temp_str);
new CheckBox(line, rect_t{}, GET_SET_AND_SYNC(cfg, vCfg->PWMFrequency.Synchronized,
new ToggleSwitch(line, rect_t{}, GET_SET_AND_SYNC(cfg, vCfg->PWMFrequency.Synchronized,
afhds3::DirtyConfig::DC_RX_CMD_FREQUENCY_V0));
line = form->newLine(&grid);

Expand Down Expand Up @@ -212,7 +210,7 @@ AFHDS3_Options::AFHDS3_Options(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP)
temp_str += " ";
temp_str += STR_SYNC;
new StaticText(line, rect_t{}, temp_str);
new CheckBox(
new ToggleSwitch(
line, rect_t{}, GET_DEFAULT((vCfg->PWMFrequenciesV1.Synchronized&1<<i)>>i),
[=](uint8_t newVal) {
vCfg->PWMFrequenciesV1.Synchronized &= ~(1<<i);
Expand Down
2 changes: 1 addition & 1 deletion radio/src/gui/colorlcd/afhds3_options.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include "page.h"
#include "pulses/afhds3_config.h"

struct PWMfrequencyChoice : public FormGroup {
struct PWMfrequencyChoice : public FormWindow {
PWMfrequencyChoice(Window* parent, uint8_t moduleIdx, uint8_t channelIdx);
PWMfrequencyChoice(Window* parent, uint8_t moduleIdx);
void update() const;
Expand Down
2 changes: 1 addition & 1 deletion radio/src/gui/colorlcd/bitmaps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ struct _BuiltinIcon {
};

static const _BuiltinIcon _builtinIcons[] = {
{ICON_OPENTX, mask_edgetx},
{ICON_EDGETX, mask_edgetx},
#if defined(HARDWARE_TOUCH)
{ICON_NEXT, mask_next},
{ICON_BACK, mask_back},
Expand Down
2 changes: 1 addition & 1 deletion radio/src/gui/colorlcd/channel_range.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ void cb_value_changed(lv_event_t* e) {
}

ChannelRange::ChannelRange(Window* parent) :
FormGroup(parent, rect_t{})
FormWindow(parent, rect_t{})
{
setFlexLayout(LV_FLEX_FLOW_ROW);
lv_obj_set_width(lvobj, LV_SIZE_CONTENT);
Expand Down
2 changes: 1 addition & 1 deletion radio/src/gui/colorlcd/channel_range.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include "form.h"
#include "numberedit.h"

class ChannelRange : public FormGroup
class ChannelRange : public FormWindow
{
public:
ChannelRange(Window* parent);
Expand Down
10 changes: 5 additions & 5 deletions radio/src/gui/colorlcd/color_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void ColorBar::on_key(lv_event_t* e)
uint32_t key = *(uint32_t*)lv_event_get_param(e);
if (key == LV_KEY_LEFT) {
if (bar->value > 0) {
auto accel = rotaryEncoderGetAccel();
uint32_t accel = rotaryEncoderGetAccel();
bar->value--;
if (accel > 0) {
if (accel > bar->value) bar->value = 0;
Expand All @@ -75,7 +75,7 @@ void ColorBar::on_key(lv_event_t* e)
}
} else if (key == LV_KEY_RIGHT) {
if (bar->value < bar->maxValue) {
auto accel = rotaryEncoderGetAccel();
uint32_t accel = rotaryEncoderGetAccel();
bar->value++;
if (accel > 0) {
if (accel < bar->maxValue - bar->value) bar->value += accel;
Expand Down Expand Up @@ -327,7 +327,7 @@ void ThemeColorType::makeButton(Window* parent, uint32_t color)

void ThemeColorType::makeButtonsRow(Window* parent, uint32_t c1, uint32_t c2, uint32_t c3)
{
auto hbox = new FormGroup(parent, rect_t{});
auto hbox = new FormWindow(parent, rect_t{});
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
lv_obj_set_flex_align(hbox->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);

Expand All @@ -347,7 +347,7 @@ ThemeColorType::ThemeColorType(Window* parent, uint32_t color) :
lv_style_set_border_width(&style, 2);
lv_style_set_border_color(&style, lv_palette_main(LV_PALETTE_GREY));

auto vbox = new FormGroup(parent, rect_t{});
auto vbox = new FormWindow(parent, rect_t{});
vbox->setFlexLayout(LV_FLEX_FLOW_COLUMN, lv_dpx(8));

makeButtonsRow(vbox, COLOR_THEME_PRIMARY1, COLOR_THEME_PRIMARY2, COLOR_THEME_PRIMARY3);
Expand All @@ -366,7 +366,7 @@ uint32_t ThemeColorType::getRGB()
/////////////////////////////////////////////////////////////////////////
ColorEditor::ColorEditor(Window *parent, const rect_t& rect, uint32_t color,
std::function<void (uint32_t rgb)> setValue) :
FormGroup(parent, rect),
FormWindow(parent, rect),
_setValue(std::move(setValue)),
_color(color)
{
Expand Down
2 changes: 1 addition & 1 deletion radio/src/gui/colorlcd/color_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ enum COLOR_EDITOR_TYPE
};

// the ColorEditor() control is a group of other controls
class ColorEditor : public FormGroup
class ColorEditor : public FormWindow
{
public:
ColorEditor(Window* parent, const rect_t& rect, uint32_t color,
Expand Down
10 changes: 5 additions & 5 deletions radio/src/gui/colorlcd/color_picker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,13 +71,13 @@ class ColorEditorPopup : public Dialog
auto cedit = new ColorEditor(line, r, color, [=](uint32_t c) { updateColor(c); });
lv_obj_set_style_grid_cell_x_align(cedit->getLvObj(), LV_GRID_ALIGN_CENTER, 0);

auto vbox = new FormGroup(line, rect_t{});
auto vbox = new FormWindow(line, rect_t{});
lv_obj_set_style_grid_cell_x_align(vbox->getLvObj(), LV_GRID_ALIGN_CENTER, 0);
vbox->setFlexLayout(LV_FLEX_FLOW_COLUMN, lv_dpx(8));
vbox->setWidth(r.w);
vbox->setHeight(r.h);

auto hbox = new FormGroup(vbox, rect_t{});
auto hbox = new FormWindow(vbox, rect_t{});
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
auto hbox_obj = hbox->getLvObj();
lv_obj_set_flex_align(hbox_obj, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_SPACE_AROUND);
Expand All @@ -92,7 +92,7 @@ class ColorEditorPopup : public Dialog

updateColor(color);

hbox = new FormGroup(vbox, rect_t{});
hbox = new FormWindow(vbox, rect_t{});
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
lv_obj_set_flex_align(hbox->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_AROUND);

Expand Down Expand Up @@ -127,7 +127,7 @@ class ColorEditorPopup : public Dialog
// color editor defaults to HSV
hsvBtn->check(true);

hbox = new FormGroup(vbox, rect_t{});
hbox = new FormWindow(vbox, rect_t{});
hbox->setFlexLayout(LV_FLEX_FLOW_ROW, lv_dpx(8));
lv_obj_set_flex_align(hbox->getLvObj(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_END, LV_FLEX_ALIGN_SPACE_BETWEEN);
lv_obj_set_flex_grow(hbox->getLvObj(), 1);
Expand Down Expand Up @@ -170,7 +170,7 @@ static void color_editor_popup(lv_event_t* e)
ColorPicker::ColorPicker(Window* parent, const rect_t& rect,
std::function<uint16_t()> getValue,
std::function<void(uint16_t)> setValue) :
FormField(parent, rect, 0, 0, lv_btn_create),
FormField(parent, rect, 0, 0, etx_button_create),
setValue(std::move(setValue))
{
lv_obj_set_style_bg_opa(lvobj, LV_OPA_100, LV_PART_MAIN);
Expand Down
37 changes: 37 additions & 0 deletions radio/src/gui/colorlcd/colors.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,50 @@ enum LcdColorIndex {
LCD_COLOR_COUNT,
};

#define ARGB_SPLIT(color, a, r, g, b) \
uint16_t a = ((color) & 0xF000) >> 12; \
uint16_t r = ((color) & 0x0F00) >> 8; \
uint16_t g = ((color) & 0x00F0) >> 4; \
uint16_t b = ((color) & 0x000F)

#define RGB_SPLIT(color, r, g, b) \
uint16_t r = ((color) & 0xF800) >> 11; \
uint16_t g = ((color) & 0x07E0) >> 5; \
uint16_t b = ((color) & 0x001F)

#define ARGB_JOIN(a, r, g, b) \
(((a&0xF) << 12) + ((r&0xF) << 8) + ((g&0xF) << 4) + (b&0xF))

#define RGB_JOIN(r, g, b) \
(((r) << 11) + ((g) << 5) + (b))

#define GET_RED(color) \
(((color) & 0xF800) >> 8)

#define GET_GREEN(color) \
(((color) & 0x07E0) >> 3)

#define GET_BLUE(color) \
(((color) & 0x001F) << 3)

#define OPACITY_MAX 0x0Fu
#define OPACITY(value) ((value) & OPACITY_MAX)

#define RGB(r, g, b) (uint16_t)((((r) & 0xF8) << 8) + (((g) & 0xFC) << 3) + (((b) & 0xF8) >> 3))
#define ARGB(a, r, g, b) (uint16_t)((((a) & 0xF0) << 8) + (((r) & 0xF0) << 4) + (((g) & 0xF0) << 0) + (((b) & 0xF0) >> 4))

#define COLOR2FLAGS(color) LcdFlags(unsigned(color) << 16u)
#define COLOR_VAL(flags) ((flags) >> 16u)
#define COLOR_MASK(flags) ((flags) & 0xFFFF0000u)

//
// Basic color definitions
//

#define WHITE RGB(0xFF, 0xFF, 0xFF)
#define BLACK RGB(0, 0, 0)

#define RGB_FLAG 0x8000u
#define RGB2FLAGS(r, g, b) (COLOR2FLAGS(RGB(r, g, b)) | RGB_FLAG)

//
Expand Down
Loading

0 comments on commit 69338ab

Please sign in to comment.