+ window->aph = get_value();
+ window->handle_event();
+ return 1;
+}
+
+PaletteLum::PaletteLum(ColorWindow *window, int x, int y)
+ : BC_FSlider(x, y, 0, 150, 200, 0, 1, window->yuv.y, 0)
+{
+ this->window = window;
+ set_precision(0.01);
+}
+PaletteLum::~PaletteLum()
+{
+}
+
+int PaletteLum::handle_event()
+{
+ window->yuv.y = get_value();
+ window->update_yuv();
+ window->handle_event();
+ return 1;
+}
+
+PaletteCr::PaletteCr(ColorWindow *window, int x, int y)
+ : BC_FSlider(x, y, 0, 150, 200, 0, 1, window->yuv.u, 0)
+{
+ this->window = window;
+ set_precision(0.01);
+}
+PaletteCr::~PaletteCr()
+{
+}
+
+int PaletteCr::handle_event()
+{
+ window->yuv.u = get_value();
+ window->update_yuv();
+ window->handle_event();
+ return 1;
+}
+
+PaletteCb::PaletteCb(ColorWindow *window, int x, int y)
+ : BC_FSlider(x, y, 0, 150, 200, 0, 1, window->yuv.v, 0)
+{
+ this->window = window;
+ set_precision(0.01);
+}
+PaletteCb::~PaletteCb()
+{
+}
+
+int PaletteCb::handle_event()
+{
+ window->yuv.v = get_value();
+ window->update_yuv();
+ window->handle_event();
+ return 1;
+}
+
+void ColorWindow::update_rgb(float r, float g, float b)
+{
+ { float y, u, v;
+ YUV::rgb_to_yuv_f(r, g, b, y, u, v);
+ u += 0.5; v += 0.5;
+ bclamp(y, 0, 1); yuv.y = y;
+ bclamp(u, 0, 1); yuv.u = u;
+ bclamp(v, 0, 1); yuv.v = v; }
+ { float h, s, v;
+ HSV::rgb_to_hsv(r,g,b, h,s,v);
+ bclamp(h, 0, 360); hsv.h = h;
+ bclamp(s, 0, 1); hsv.s = s;
+ bclamp(v, 0, 1); hsv.v = v; }
+}
+
+void ColorWindow::update_yuv(float y, float u, float v)
+{
+ u -= 0.5; v -= 0.5;
+ { float r, g, b;
+ YUV::yuv_to_rgb_f(r, g, b, y, u, v);
+ bclamp(r, 0, 1); rgb.r = r;
+ bclamp(g, 0, 1); rgb.g = g;
+ bclamp(b, 0, 1); rgb.b = b;
+ float h, s, v;
+ HSV::rgb_to_hsv(r,g,b, h, s, v);
+ bclamp(h, 0, 360); hsv.h = h;
+ bclamp(s, 0, 1); hsv.s = s;
+ bclamp(v, 0, 1); hsv.v = v; }
+}
+
+void ColorWindow::update_hsv(float h, float s, float v)
+{
+ { float r, g, b;
+ HSV::hsv_to_rgb(r,g,b, h,s,v);
+ bclamp(r, 0, 1); rgb.r = r;
+ bclamp(g, 0, 1); rgb.g = g;
+ bclamp(b, 0, 1); rgb.b = b;
+ float y, u, v;
+ YUV::rgb_to_yuv_f(r, g, b, y, u, v);
+ u += 0.5; v += 0.5;
+ bclamp(y, 0, 1); yuv.y = y;
+ bclamp(u, 0, 1); yuv.u = u;
+ bclamp(v, 0, 1); yuv.v = v; }
+}
+
+void ColorWindow::load_history()
+{
+ char history_path[BCTEXTLEN];
+ MWindow::create_defaults_path(history_path,PALETTE_DATA);
+ FILE *fp = fopen(history_path,"r");
+ int i=0;
+ if( fp ) {
+ while( i < PALLETTE_HISTORY_SIZE ) {
+ char line[BCSTRLEN];
+ if( !fgets(line,sizeof(line)-1,fp) ) break;
+ line[sizeof(line)-1] = 0;
+ if( sscanf(line, "%x",&palette_history[i]) != 1 ) break;
+ ++i;
+ }
+ fclose(fp);
+ }
+ int r = 0, g = 0, b = 0;
+ float v0 = 0, v1 = 1;
+ while( i < PALLETTE_HISTORY_SIZE ) {
+ int grey_code = i ^ (i>>1);
+ r = 255 * ((grey_code&4) ? v0 : v1);
+ g = 255 * ((grey_code&2) ? v0 : v1);
+ b = 255 * ((grey_code&1) ? v0 : v1);
+ int color = (r<<16) | (g<<8) | (b<<0);
+ palette_history[i++] = color;
+ if( i & 7 ) continue;
+ v0 = 0.5f * (v0+.5f);
+ v1 = 0.5f * (v1+.5f);
+ }
+}
+void ColorWindow::save_history()
+{
+ char history_path[BCTEXTLEN];
+ MWindow::create_defaults_path(history_path,PALETTE_DATA);
+ FILE *fp = fopen(history_path,"w");
+ if( fp ) {
+ for( int i=0; i<PALLETTE_HISTORY_SIZE; ++i ) {
+ fprintf(fp, "%06x\n", palette_history[i]);
+ }
+ fclose(fp);
+ }
+}
+void ColorWindow::update_history(int color)
+{
+ int out = palette_history[0];
+ palette_history[0] = color;
+ for( int i=1; out != color && i<PALLETTE_HISTORY_SIZE; ++i ) {
+ int in = out;
+ out = palette_history[i];
+ palette_history[i] = in;
+ }
+}
+void ColorWindow::update_history()
+{
+ update_history(rgb888());
+ history->update(0);
+}
+int ColorWindow::rgb888()
+{
+ int r = 255*rgb.r + 0.5, g = 255*rgb.g + 0.5, b = 255*rgb.b + 0.5;
+ bclamp(r, 0, 255); bclamp(g, 0, 255); bclamp(b, 0, 255);
+ return (r<<16) | (g<<8) | (b<<0);
+}
+
+PaletteNum::PaletteNum(ColorWindow *window, int x, int y,
+ float &output, float min, float max)
+ : BC_TumbleTextBox(window, output, min, max, x, y, 64)
+{
+ this->window = window;
+ this->output = &output;
+ set_increment(0.01);
+ set_precision(2);
+}
+
+PaletteNum::~PaletteNum()
+{
+}
+
+
+int PaletteHSV::handle_event()
+{
+ update_output();
+ window->update_hsv();