diff --git a/escher/include/escher/palette.h b/escher/include/escher/palette.h index c78c6aea9..9b53c8833 100644 --- a/escher/include/escher/palette.h +++ b/escher/include/escher/palette.h @@ -30,6 +30,8 @@ public: constexpr static KDColor Orange = KDColor::RGB24(0xfe871f); constexpr static KDColor Green = KDColor::RGB24(0x50c102); constexpr static KDColor GreenLight = KDColor::RGB24(0x52db8f); + constexpr static KDColor Brown = KDColor::RGB24(0x8d7350); + constexpr static KDColor Purple = KDColor::RGB24(0x6e2d79); constexpr static KDColor DataColor[] = {Red, Blue, Green, YellowDark}; constexpr static KDColor DataColorLight[] = {RedLight, BlueLight, GreenLight, YellowLight}; }; diff --git a/escher/src/palette.cpp b/escher/src/palette.cpp index ba4b72151..dcb617ee7 100644 --- a/escher/src/palette.cpp +++ b/escher/src/palette.cpp @@ -25,5 +25,7 @@ constexpr KDColor Palette::BlueLight; constexpr KDColor Palette::Orange; constexpr KDColor Palette::Green; constexpr KDColor Palette::GreenLight; +constexpr KDColor Palette::Brown; +constexpr KDColor Palette::Purple; constexpr KDColor Palette::DataColor[]; constexpr KDColor Palette::DataColorLight[]; diff --git a/python/port/mod/turtle/modturtle.cpp b/python/port/mod/turtle/modturtle.cpp index 992b90281..6d6afe8f9 100644 --- a/python/port/mod/turtle/modturtle.cpp +++ b/python/port/mod/turtle/modturtle.cpp @@ -120,8 +120,39 @@ mp_obj_t modturtle_isdown() { return sTurtle.isPenDown() ? mp_const_true : mp_const_false; } -mp_obj_t modturtle_color(mp_obj_t r, mp_obj_t g, mp_obj_t b) { - sTurtle.setColor(KDColor::RGB888(mp_obj_get_int(r), mp_obj_get_int(g), mp_obj_get_int(b))); +mp_obj_t modturtle_pencolor(size_t n_args, const mp_obj_t *args) { + if (n_args == 0) { + // pencolor() + KDColor c = sTurtle.color(); + mp_obj_t mp_col[3]; + mp_col[0] = mp_obj_new_int_from_uint(c.red()); + mp_col[1] = mp_obj_new_int_from_uint(c.green()); + mp_col[2] = mp_obj_new_int_from_uint(c.blue()); + return mp_obj_new_tuple(3, mp_col); + } + if (n_args == 1) { + if (MP_OBJ_IS_STR(args[0])) { + // pencolor("blue") + size_t l; + sTurtle.setColor(mp_obj_str_get_data(args[0], &l)); + } else { + // pencolor((r, g, b)) + mp_obj_t * rgb; + mp_obj_get_array_fixed_n(args[0], 3, &rgb); + sTurtle.setColor( + KDColor::RGB888( + mp_obj_get_int(rgb[0]), + mp_obj_get_int(rgb[1]), + mp_obj_get_int(rgb[2]))); + } + } else if (n_args == 3) { + // pencolor(r, g, b) + sTurtle.setColor( + KDColor::RGB888( + mp_obj_get_int(args[0]), + mp_obj_get_int(args[1]), + mp_obj_get_int(args[2]))); + } return mp_const_none; } diff --git a/python/port/mod/turtle/modturtle.h b/python/port/mod/turtle/modturtle.h index 93fe483b9..0a77a0d75 100644 --- a/python/port/mod/turtle/modturtle.h +++ b/python/port/mod/turtle/modturtle.h @@ -23,7 +23,7 @@ mp_obj_t modturtle_isdown(); mp_obj_t modturtle_pensize(size_t n_args, const mp_obj_t *args); mp_obj_t modturtle_isvisible(); -mp_obj_t modturtle_color(mp_obj_t r, mp_obj_t g, mp_obj_t b); +mp_obj_t modturtle_pencolor(size_t n_args, const mp_obj_t *args); mp_obj_t modturtle_showturtle(); mp_obj_t modturtle_hideturtle(); diff --git a/python/port/mod/turtle/modturtle_table.c b/python/port/mod/turtle/modturtle_table.c index 6f6369a54..d6794743f 100644 --- a/python/port/mod/turtle/modturtle_table.c +++ b/python/port/mod/turtle/modturtle_table.c @@ -19,7 +19,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_penup_obj, modturtle_penup); STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_isdown_obj, modturtle_isdown); STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modturtle_pensize_obj, 0, 1, modturtle_pensize); -STATIC MP_DEFINE_CONST_FUN_OBJ_3(modturtle_color_obj, modturtle_color); +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modturtle_pencolor_obj, 0, 3, modturtle_pencolor); STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_showturtle_obj, modturtle_showturtle); STATIC MP_DEFINE_CONST_FUN_OBJ_0(modturtle_hideturtle_obj, modturtle_hideturtle); @@ -64,7 +64,8 @@ STATIC const mp_rom_map_elem_t modturtle_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_pensize), (mp_obj_t)&modturtle_pensize_obj }, { MP_ROM_QSTR(MP_QSTR_width), (mp_obj_t)&modturtle_pensize_obj }, - { MP_ROM_QSTR(MP_QSTR_pencolor), (mp_obj_t)&modturtle_color_obj }, + { MP_ROM_QSTR(MP_QSTR_color), (mp_obj_t)&modturtle_pencolor_obj }, + { MP_ROM_QSTR(MP_QSTR_pencolor), (mp_obj_t)&modturtle_pencolor_obj }, { MP_ROM_QSTR(MP_QSTR_showturtle), (mp_obj_t)&modturtle_showturtle_obj }, { MP_ROM_QSTR(MP_QSTR_st), (mp_obj_t)&modturtle_showturtle_obj }, diff --git a/python/port/mod/turtle/turtle.cpp b/python/port/mod/turtle/turtle.cpp index b77bd710b..16a73fb64 100644 --- a/python/port/mod/turtle/turtle.cpp +++ b/python/port/mod/turtle/turtle.cpp @@ -1,4 +1,5 @@ #include "turtle.h" +#include extern "C" { #include } @@ -144,6 +145,32 @@ void Turtle::setVisible(bool visible) { } } +void Turtle::setColor(const char * color) { + if (strcmp("blue", color) == 0) { + m_color = KDColorBlue; + } else if (strcmp("red", color) == 0) { + m_color = KDColorRed; + } else if (strcmp("green", color) == 0) { + m_color = Palette::Green; + } else if (strcmp("yellow", color) == 0) { + m_color = KDColorYellow; + } else if (strcmp("brown", color) == 0) { + m_color = Palette::Brown; + } else if (strcmp("black", color) == 0) { + m_color = KDColorBlack; + } else if (strcmp("white", color) == 0) { + m_color = KDColorWhite; + } else if (strcmp("pink", color) == 0) { + m_color = Palette::Pink; + } else if (strcmp("orange", color) == 0) { + m_color = Palette::Orange; + } else if (strcmp("purple", color) == 0) { + m_color = Palette::Purple; + } else if (strcmp("grey", color) == 0) { + m_color = Palette::GreyDark; + } +} + // Private functions void Turtle::setHeadingPrivate(mp_float_t angle) { diff --git a/python/port/mod/turtle/turtle.h b/python/port/mod/turtle/turtle.h index 2fe81ade5..3c3ec406a 100644 --- a/python/port/mod/turtle/turtle.h +++ b/python/port/mod/turtle/turtle.h @@ -63,10 +63,14 @@ public: bool isVisible() const { return m_visible; } void setVisible(bool visible); + KDColor color() const { return m_color; } void setColor(KDColor c) { m_color = c; } - + void setColor(uint8_t r, uint8_t g, uint8_t b) { + m_color = KDColor::RGB888(r, g, b); + } + void setColor(const char * color); private: static constexpr mp_float_t k_headingOffset = M_PI_2; static constexpr mp_float_t k_headingScale = M_PI / 180;