// Reference: http://en.wikipedia.org/wiki/HSL_and_HSV Rgb::Rgb(const Hsv& hsv) { double chroma = hsv.value() * hsv.saturation(); double hue_prime = hsv.hue() / 60.0; double x = chroma * (1.0 - fabs(fmod(hue_prime, 2.0) - 1.0)); double r, g, b; r = g = b = 0.0; switch (int(hue_prime)) { case 6: case 0: r = chroma; g = x; break; case 1: r = x; g = chroma; break; case 2: g = chroma; b = x; break; case 3: g = x; b = chroma; break; case 4: b = chroma; r = x; break; case 5: b = x; r = chroma; break; } double m = hsv.value() - chroma; r += m; g += m; b += m; m_red = int(r*255.0+0.5); m_green = int(g*255.0+0.5); m_blue = int(b*255.0+0.5); }
void Mood::run() { uint8_t running = 1; uint16_t buttons; Hsv hsv = Hsv(0,255,127); while (running > 0) { matrix.rectangle(0,0,11,11,DRAW_FILLED); matrix.flush(); _delay_ms(127); hsv.addHue(1); matrix.setColor(Rgb(hsv)); psx.poll(); buttons = psx.buttons(); if (buttons & PSB_TRIANGLE) { running = false; } } }
void Life::flush() { hsv.addHue(1); Rgb rgb = Rgb(hsv); for (uint8_t x = 0; x < MATRIX_WIDTH; x++) { for (uint8_t y = 0; y < MATRIX_HEIGHT; y++) { if (state[x][y] > 0) { matrix.setColor(rgb); } else { matrix.setColor(0,0,0); } matrix.setPixel(x, y); } } matrix.flush(); }
int main() { twi_init(); srandom(0); //timer_init(); DDRB = 0xff; PORTB = 0x00; uint16_t buttons; uint16_t changed; uint8_t selected = 0; matrix.setFont(font_3x5, codepage_ascii_caps, 3, 5); while (1) { psx.poll(); buttons = psx.buttons(); changed = psx.changed(); if (buttons & PSB_SELECT && changed & PSB_SELECT) { selected++; selected %= 6; } else if (buttons & PSB_SQUARE && changed & PSB_SQUARE) { hsv.addHue(-30); } else if (buttons & PSB_CIRCLE && changed & PSB_CIRCLE) { hsv.addHue(30); } else if (buttons & PSB_PAD_DOWN && changed & PSB_PAD_DOWN) { uint8_t v = hsv.getValue(); switch (v) { case 0xff: hsv.setValue(0x7f); break; case 0x7f: hsv.setValue(0x3f); break; case 0x3f: hsv.setValue(0x1f); break; case 0x1f: hsv.setValue(0x0f); break; case 0x0f: hsv.setValue(0x07); break; case 0x07: hsv.setValue(0x03); break; case 0x03: hsv.setValue(0x01); break; default: hsv.setValue(0x00); } } else if (buttons & PSB_PAD_UP && changed & PSB_PAD_UP) { uint8_t v = hsv.getValue(); switch (v) { case 0x00: hsv.setValue(0x01); break; case 0x01: hsv.setValue(0x03); break; case 0x03: hsv.setValue(0x07); break; case 0x07: hsv.setValue(0x0f); break; case 0x0f: hsv.setValue(0x1f); break; case 0x1f: hsv.setValue(0x3f); break; case 0x3f: hsv.setValue(0x7f); break; default: hsv.setValue(0xff); } } else if (buttons & PSB_PAD_LEFT && changed & PSB_PAD_LEFT) { uint8_t s = hsv.getSaturation(); switch (s) { case 0xff: hsv.setSaturation(0xfe); break; case 0xfe: hsv.setSaturation(0xfc); break; case 0xfc: hsv.setSaturation(0xf8); break; case 0xf8: hsv.setSaturation(0xf0); break; case 0xf0: hsv.setSaturation(0xe0); break; case 0xe0: hsv.setSaturation(0xc0); break; case 0xc0: hsv.setSaturation(0x80); break; default: hsv.setSaturation(0x00); } } else if (buttons & PSB_PAD_RIGHT && changed & PSB_PAD_RIGHT) { uint8_t s = hsv.getSaturation(); switch (s) { case 0x00: hsv.setSaturation(0x80); break; case 0x80: hsv.setSaturation(0xc0); break; case 0xc0: hsv.setSaturation(0xe0); break; case 0xe0: hsv.setSaturation(0xf0); break; case 0xf0: hsv.setSaturation(0xf8); break; case 0xf8: hsv.setSaturation(0xfc); break; case 0xfc: hsv.setSaturation(0xfe); break; default: hsv.setSaturation(0xff); } } else if (buttons & PSB_START && changed & PSB_START) { switch (selected) { case 0: { Clock clk; clk.run(); break; } case 1: { AltClock alt; alt.run(); break; } case 2: { Life life; life.run(); break; } case 3: { Mood mood; mood.run(); break; } case 4: { Animated ani; ani.run(); break; } case 5: { Tictactoe ttt; ttt.run(); break; } case 6: { Tetris tet; tet.run(); break; } } } matrix.setColor(0,0,0); matrix.rectangle(0,0,11,11, DRAW_FILLED); matrix.setColor(Rgb(hsv)); switch (selected) { case 0: matrix.text(0, 3, "CLK", DRAW_ORIENTATION_0); break; case 1: matrix.text(0, 3, "ALT", DRAW_ORIENTATION_0); break; case 2: matrix.text(0, 3, "LIF", DRAW_ORIENTATION_0); break; case 3: matrix.text(0, 3, "MOO", DRAW_ORIENTATION_0); break; case 4: matrix.text(0, 3, "ANI", DRAW_ORIENTATION_0); break; case 5: matrix.text(0, 3, "TTT", DRAW_ORIENTATION_0); break; case 6: matrix.text(0, 3, "TET", DRAW_ORIENTATION_0); break; } matrix.flush(); _delay_ms(127); } }
void PaletteEntryEditor::setAbsolutePaletteEntryChannel(ColorSliders::Channel channel, const app::Color& color) { PalettePicks entries; getPicks(entries); int picksCount = entries.picks(); uint32_t src_color; int r, g, b; Palette* palette = get_current_palette(); for (int c=0; c<palette->size(); c++) { if (!entries[c]) continue; // Get the current RGB values of the palette entry src_color = palette->getEntry(c); r = rgba_getr(src_color); g = rgba_getg(src_color); b = rgba_getb(src_color); switch (m_type) { case app::Color::RgbType: // Modify one entry if (picksCount == 1) { r = color.getRed(); g = color.getGreen(); b = color.getBlue(); } // Modify one channel a set of entries else { // Setup the new RGB values depending of the modified channel. switch (channel) { case ColorSliders::Red: r = color.getRed(); case ColorSliders::Green: g = color.getGreen(); break; case ColorSliders::Blue: b = color.getBlue(); break; } } break; case app::Color::HsvType: { Hsv hsv; // Modify one entry if (picksCount == 1) { hsv.hue(color.getHue()); hsv.saturation(double(color.getSaturation()) / 100.0); hsv.value(double(color.getValue()) / 100.0); } // Modify one channel a set of entries else { // Convert RGB to HSV hsv = Hsv(Rgb(r, g, b)); // Only modify the desired HSV channel switch (channel) { case ColorSliders::Hue: hsv.hue(color.getHue()); break; case ColorSliders::Saturation: hsv.saturation(double(color.getSaturation()) / 100.0); break; case ColorSliders::Value: hsv.value(double(color.getValue()) / 100.0); break; } } // Convert HSV back to RGB Rgb rgb(hsv); r = rgb.red(); g = rgb.green(); b = rgb.blue(); } break; } palette->setEntry(c, doc::rgba(r, g, b, 255)); } }